为什么打印“B”比打印“#”慢得多?

2022-08-31 01:21:54

我生成了两个 x 矩阵:10001000

第一个矩阵:和 .
第二个矩阵:和 。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.8871System.out.print("B");still printing...

正如其他人指出的那样,它通常适用于他们,例如,我尝试 Ideone.com,并且两段代码以相同的速度执行。

测试条件:

  • 我从 Netbeans 7.2 运行了这个测试,并将输出放到其控制台中
  • 我用于测量System.nanoTime()

答案 1

纯粹的推测是,您正在使用一个终端,该终端尝试执行自动换行而不是字符换行,并将其视为单词字符但被视为非单词字符。因此,当它到达一条线的末尾并寻找一个断开线的地方时,它几乎立即看到一个快乐地中断;而对于 ,它必须继续搜索更长时间,并且可能有更多的文本要换行(这在某些终端上可能很昂贵,例如,输出退格,然后输出空格以覆盖被换行的字母)。B##B

但这纯粹是猜测。


答案 2

我在Eclipse vs Netbeans 8.0.2上执行了测试,两者都使用Java版本1.8;我用于测量。System.nanoTime()

日蚀:

我在两种情况下都得到了相同的时间 - 大约1.564秒

网豆:

  • 使用“#”: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 有一个可以解决的换行问题(因为该问题不会在 eclipse 中发生)(无需在 B(“B”)后添加空格)。

推荐