Java System.out.print效率
在过去的几天里,我做了一些有竞争力的编程练习,发现了一些问题的解决方案,他们没有在控制台中以for循环打印文本,而是通过在文本之后追加文本来构建一个StringBuilder。首先我感到困惑,但我尝试了一下,并制定了一些基准 第一个测试:这是在屏幕上打印内容的经典方法:Java System.out.print效率,java,performance,io,stringbuilder,Java,Performance,Io,Stringbuilder,在过去的几天里,我做了一些有竞争力的编程练习,发现了一些问题的解决方案,他们没有在控制台中以for循环打印文本,而是通过在文本之后追加文本来构建一个StringBuilder。首先我感到困惑,但我尝试了一下,并制定了一些基准 第一个测试:这是在屏幕上打印内容的经典方法: class TestClass { public static void main(String args[]) throws Exception { double startTime = System
class TestClass {
public static void main(String args[]) throws Exception {
double startTime = System.currentTimeMillis();
//code
for (int i = 0; i < 1000000; i++) {
System.out.print("test");
}
//code
double endTime = System.currentTimeMillis();
String result = String.format("for loop: %.5f", (endTime-startTime) / 1000);
System.out.print("\n"+result);
}
}
在使用Intel i5 6500四核3.2 GHZ CPU Win 10运行测试数次后,结果如下:
first test(for loop): 4,25s
second test(StringBuilder): 0.23s
结果并不意外,因为out.print是同步的,所以每次调用它时,都会增加一些开销。但速度慢了近20倍有点奇怪
我的问题是:我们有没有办法进一步改进这一点?在这种情况下,同步关键字不应该受到指责
第一个测试用例很慢,因为System.out.print将带来频繁的最小I/O
您也可以使用BufferedWriterit的写入方法进行同步,以减少不必要的I/O:
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
//code
for (int i = 0; i < 1000000; i++) {
log.write("test");
}
for loop: 0.21200
阅读本文:基准测试-好的,谢谢,我会尽快看一看。控制台输出非常慢,因为文本需要以图形方式呈现,这需要完全重画控制台屏幕。它不使用GPU,因为这会增加更多依赖项,因此您必须等待CPU重新绘制屏幕。这意味着您将等待CPU迭代每个像素,以便在每次输出后正确更新屏幕。每次调用输出函数可能需要几十万到几百万个CPU周期。用具体大小初始化StringBuilder的想法很好,我对它进行了测试,它确实提高了性能您确定StringBuilder的容量是以字节而不是字符来衡量的吗?@DodgyCodeException是的,检查源代码。哪个版本?在Java 8中,StringBuilder是使用char[]实现的。@DodgyCodeException Java 10.0.1
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
//code
for (int i = 0; i < 1000000; i++) {
log.write("test");
}
for loop: 0.21200
StringBuilder sb = new StringBuilder(1000000 * 10);