将字符串输出到系统的最快方法是什么?

Cod*_*ith 16 java

我正在做这样的事情:

for (int i = 0; i < 100000; i++) {
   System.out.println( i );
}
Run Code Online (Sandbox Code Playgroud)

基本上,我计算一个整数并输出一个大约10K-100K次的字符串,然后需要将结果写入system.out,每个结果用换行符分隔.

实现这一目标的最快方法是什么?

Cod*_*ith 29

感谢您的建议.我创建了一个测试程序来比较它们:

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.StringBuilder;

public class systemouttest {

    public static void main(String[] args) throws Exception {

        long starttime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
           System.out.println( i );
        }
        long printlntime = System.currentTimeMillis();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append( i + "\n" );
        }
        System.out.print(sb.toString());
        long stringbuildertime = System.currentTimeMillis();

        OutputStream out = new BufferedOutputStream ( System.out );
        for (int i = 0; i < 100000; i++) {
            out.write((i + "\n").getBytes());
        }
        out.flush();
        long bufferedoutputtime = System.currentTimeMillis();

        BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
        for (int i = 0; i < 100000; i++) {
            log.write(i + "\n");
        }
        log.flush();
        long bufferedwritertime = System.currentTimeMillis();

        System.out.println( "System.out.println: " + (printlntime - starttime) );
        System.out.println( "StringBuilder: " + (stringbuildertime - printlntime) );
        System.out.println( "BufferedoutputStream: " + (bufferedoutputtime - stringbuildertime) );
        System.out.println( "BufferedWriter: " + (bufferedwritertime - bufferedoutputtime) );
    }

}
Run Code Online (Sandbox Code Playgroud)

结果:

Environment1
System.out.println:482
StringBuilder:210
BufferedoutputStream:86
BufferedWriter:202

Environment2
System.out.println:1763
StringBuilder:45
BufferedoutputStream:76
BufferedWriter:34

所有建议都比System.out.println更好.BufferedOutputStream似乎是最安全的选择,因为它在两个测试环境中都表现良好.BufferedWriter可能更快.

如果有人有想法,请发表进一步的建议.我相信有人可以让它变得更快:)

  • 请参阅[如何在Java中编写正确的微基准测试?](/sf/ask/35287241/)因为您在此处发布的测量值很可能不可靠 (3认同)

Aka*_* KC 5

对于大量数据,System.out.println可能效率低下,因为它没有很好的缓冲。在这种情况下,您可以使用 aBufferedOutputStream或 a BufferedWriter