为什么Java打印“B”比打印“#”慢得多?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:为什么Java打印“B”比打印“#”慢得多?

我生成了两个1000 * 1000的矩阵:

第一个矩阵:O#组成

第二个矩阵:OB组成

使用如下代码,第一个矩阵花费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
.
.
.
复制代码

总结

  1. Eclipse在打印B上表现更好
  2. Netbeans有一个需要解决的换行问题(因为这个问题不会在eclipse上出现)

文章翻译自Stack Overflow:stackoverflow.com/questions/2…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享