为什么打印“B”大大低于打印“#”慢?为什么打印“B”大大低于打印“#”慢?(Why is prin

2019-05-12 12:24发布

我生成的两个矩阵1000 X 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("");
}

什么是显着不同的行进时间背后的原因是什么?


至于建议中的意见,只打印System.out.print("#"); 需要7.8871秒,而System.out.print("B");still printing...

正如其他人谁指出,为他们工作正常,我试图Ideone.com例如,和代码段都以相同的速度执行。

测试条件:

  • 我跑这个测试通过NetBeans 7.2,与输出到其控制台
  • 我用System.nanoTime()进行测量

Answer 1:

纯粹猜测是,你正在使用的尝试做一个终端自动换行 ,而不是文字换行,并把B作为一个字字符,但#作为一个非字字符。 所以,当它到达一个线,并搜索到断行的地方结束,它看到一个#几乎立刻开心地打破了那里。 而用B ,它必须保持在搜索时间更长,并且可以具有更多的文本换行(其可以是在某些终端昂贵,例如退格输出,然后输出的空间覆盖的字母被包裹)。

但是,这纯粹是猜测。



Answer 2:

我进行的测试基于Eclipse VS Netbeans的8.0.2,都与Java版本1.8; 我用System.nanoTime()进行测量。

日食:

在这两种情况下同一时间 -围绕1.564秒

Netbeans的:

  • 使用“#”:1.536秒
  • 使用“B”:44.164秒

因此,它看起来像Netbeans的对打印性能不好安慰。

进一步的研究之后,我意识到这个问题是换行的NetBeans(它不局限于最大缓冲区System.out.println命令),通过代码所示:

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的具有可以解决(因为在蚀不会发生问题)(没有B(“B”)之后加入的空间)一个换行的问题。


文章来源: Why is printing “B” dramatically slower than printing “#”?