san*_* mk 9 java algorithm arraylist
我有这段代码:
while((line=br.readLine())!=null)
{
String Words[]= line.split(" ");
outputLine = SomeAlgorithm(Words);
output.write(outputLine);
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面的代码中所看到的,对于输入文件中的每一行,我正在读取一行,在其上运行一些算法,它基本上修改了该行,然后将输出行写入某个文件.
文件中有9k行,整个程序在我的机器上花了3分钟.
我想,好吧,我正在为算法的每个(行)运行做2个I/O. 所以我做了大约18k I/O. 为什么不首先收集所有行ArrayList,然后遍历列表并在每行上运行算法?还将每个输出收集到一个字符串变量中,然后在程序结束时写出所有输出一次.
这样,我整个程序总共有2个大I/O(18k小文件I/O到2个大文件I/O).我觉得这会更快,所以我写了这个:
List<String> lines = new ArrayList<String>();
while((line=br.readLine())!=null)
{
lines.add(line); // collect all lines first
}
for (String line : lines){
String Words[] = line.split(" ");
bigOutput+=SomeAlgorithm(Words); // collect all output
}
output.write(bigOutput);
Run Code Online (Sandbox Code Playgroud)
但是,这件事需要7分钟!
那么,为什么循环遍历ArrayList要慢于逐行读取文件?
注意:通过readLine()收集所有行并写入bigOutput都只需要几秒钟.SomeAlgorithm()也没有变化.所以,当然,我认为罪魁祸首是for (String line: lines)
更新:正如下面各种评论中所提到的,问题不在于ArrayList遍历,而是使用+ =累积输出的方式.转移到StringBuilder()确实给出了比原始结果更快的结果.
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |