我在做这样的事情:什么是向系统输出字符串的最快方法?
for (int i = 0; i < 100000; i++) {
System.out.println(i);
}
基本上,我计算一个整数,输出约10K-100K次字符串,然后需要将结果写入到System.out,用换行分隔每个结果。
实现此目的的最快方法是什么?
我在做这样的事情:什么是向系统输出字符串的最快方法?
for (int i = 0; i < 100000; i++) {
System.out.println(i);
}
基本上,我计算一个整数,输出约10K-100K次字符串,然后需要将结果写入到System.out,用换行分隔每个结果。
实现此目的的最快方法是什么?
感谢您的建议。我创建了一个测试程序对它们进行比较:
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));
}
}
结果:
环境1
的System.out.println:482
的StringBuilder:210
的BufferedOutputStream:86
的BufferedWriter:202
环境2
System.out.println:1763
StringBuilder的:45
的BufferedOutputStream:76
的BufferedWriter:34
的建议所有比的System.out.println表现较好。 BufferedOutputStream似乎是最安全的选择,因为它在两种测试环境中均表现良好。 BufferedWriter虽然可能会更快。
如果有人有一些想法,请发表进一步的建议。我敢肯定有人可以让它走得更快:)
请记住,I/O操作与内存处理(例如,整数解析)相比非常慢。 所以,我建议你“提前”打造整个字符串,然后(如果可能的当然)打印出来只有一次:
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < 100000; i++) { sb.append(i).append("\n");}
String printMe = sb.toString();
System.out.println(printMe);
有很多种技术,如缓冲您正在使用的产出水平流,但我认为你更喜欢留在最基本System.out.println
希望这有助于
对于大量的数据,System.out.println
可能效率不高,因为它不会让 做很好的缓冲。在这种情况下,您可以使用BufferedOutputStream
或BufferedWriter
。
写入System.out的最慢部分是显示正在写入内容的时间。即对于你写的每一行,计算机都必须使用字体将信息转换为像素并滚动整行。这比你显示文本的可能性要多得多。
可以加快由
或者写入一个空设备(例如/ dev/null),它会切断存储层。 – 2017-05-25 18:55:58
尝试几种方法并描述它们。 – John3136 2012-08-06 05:53:52