java - 为什么打印"B"显著慢于打印"#"?

  显示原文与译文双语对照的内容

我生成了 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.887 1秒,而 System.out.print("B"); 给出 still printing...

就像其他人指出它正常工作一样,我尝试了 Ideone.com 实例,并且两个代码都以相同的速度执行。

测试条件:

  • 我从 Netbeans 7.2运行这个测试,输出到它的控制台
  • 我使用 System.nanoTime() 进行测量
时间:

纯猜测是你正在使用的终端,它企图做 word-wrapping 而不是 character-wrapping,并将 B 看作一个单词字符,但 # 作为non-word字符。 所以当它到达了行尾,以及需要找一个地方与换行的位置,几乎立即折断而愉快有,看起来像是 # ;而随着 B,它必须孜孜以求,并可以有多个文本环绕( 在某些终端上可能昂贵,比如,输出 backspaces,然后输出空格以覆盖被包装的字母) 更长。

但这纯粹是猜测。

我在 Eclipse vs 8.0.2上做了一个测试,同时使用了java版本 1.8: 我使用 System.nanoTime() 进行测量

Eclipse:

在这两种情况下围绕 1.564 秒我在这找到, 一起进行,

磅:

使用"δ #":1.536秒

使用"b": 44.164 秒

看起来Netbeans在打印到控制台时表现不佳。

经过更多的研究我认识到问题是 line-wrapping的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有line-wrapping问题,可以解决( 因为在 Eclipse 中没有出现问题) ( 在("之后不增加空间) 。

...