What's the fastest way to output a string to system out?
我在做这样的事情:
1 2 3 |
基本上,我计算一个整数,输出一个大约10-100千次的字符串,然后需要将结果写入system.out,每个结果用换行符分隔。
实现这一目标的最快方法是什么?
谢谢你的建议。我创建了一个测试程序来比较它们:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 +" " ); } 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 +" ").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 +" "); } 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系统输出打印号:482字符串生成器:210缓冲输出流:86缓冲写入程序:202环境2系统输出打印编号:1763字符串生成器:45缓冲输出流:76BufferedWriter:34个
这些建议都比system.out.println执行得更好。BufferedOutputstream似乎是最安全的选择,因为它在两个测试环境中都表现良好。不过BufferedWriter可能更快。
如果有人有什么想法,请发表进一步的建议。我相信有人能让它跑得更快。)
对于大量数据,
请记住,与内存处理(例如,整数解析)相比,I/O操作非常慢。因此,我建议您提前创建整个字符串,然后只打印一次(当然,如果可能的话):
1 2 3 4 |
有各种各样的技术,比如缓冲您正在使用的输出流的级别,但是我假设您更喜欢使用最基本的
希望这有帮助
写入System.Out的最慢部分是显示正在写入的内容所用的时间。也就是说,对于你写的每一行,计算机必须使用字体将信息转换成像素,并滚动整行。这比显示文本可能要做的工作多得多。
您可以通过以下方式加快对控制台的写入速度
- 少写(通常是最好的主意)
- 改为写入文件(速度可能快5-10倍)