为什么Java List遍历比文件readline慢?

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()确实给出了比原始结果更快的结果.

NPE*_*NPE 3

我怀疑性能差异是由于您如何将输出收集到一个变量 ( bigOutput) 中造成的。我的猜测是,这涉及大量的内存重新分配和字符数据的复制,这是缓慢的真正原因。