本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问:为什么Java打印“B”比打印“#”慢得多?
我生成了两个1000 * 1000
的矩阵:
第一个矩阵:O
和#
组成
第二个矩阵:O
和B
组成
使用如下代码,第一个矩阵花费8.52秒运行完成:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("#");
}
}
System.out.println("");
}
复制代码
使用下方代码,第二个矩阵花费259.152秒运行完成:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("B"); //only line changed
}
}
System.out.println("");
}
复制代码
这两段代码运行时长差这么多的原因是什么?
回答一
我猜测是由于你使用的终端,它尝试执行单词包装而非字符包装。它将B
认为单词,而视#
为字符。当需要换行的时候,对于一个字符#
,它可以立即换行,而对于一个单词B
,它搜索换行的时间会更长,并且可能有更多的文本要包装(这些在终端上操作可能代价高昂)
回答二
- 使用Eclipse测试:
在两个用例上花费的时间差不多——1.564s
- 使用Netbeans测试:
#
:1.536s
O
:44.164s
所以这样看来Netbeans在终端打印上的表现比较糟糕。
经过更多研究,我意识到问题是Netbeans的最大缓冲区的行包装。(注意并不是System.out.println
命令换行导致的,是Netbeans IDE的最大缓冲区的行包装)
for (int i = 0; i < 1000; i++) {
long t1 = System.nanoTime();
System.out.print("BBB......BBB"); \\<-contain 1000 "B"
long t2 = System.nanoTime();
System.out.println(t2-t1);
System.out.println("");
}
复制代码
除了第五次迭代外,每次的迭代时间都小于1毫秒。第五次时间结果约为225毫秒
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.
复制代码
总结
- Eclipse在打印
B
上表现更好 - Netbeans有一个需要解决的换行问题(因为这个问题不会在eclipse上出现)
文章翻译自Stack Overflow:stackoverflow.com/questions/2…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END