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

我生成了两个矩阵1000 x1000

第一个矩阵: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()进行测量
252939 次浏览

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

但这纯粹是猜测。

我在Eclipse vs NetBeans 8.0.2上进行了测试,都使用Java版本1.8;我使用System.nanoTime()进行测量。

Eclipse:

我得到了两个案子都在同一时间-大约1.564秒

NetBeans:

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

所以,看起来Netbean在打印到控制台上的性能很差。

经过更多的研究,我意识到问题是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...31744BBB...31744BBB...31744BBB...31744BBB...226365807BBB...31744BBB...31744BBB...31744BBB...31744BBB...226365807...

等等…

总结:

  1. Eclipse与“B”完美配合
  2. NetBeans有一个可以解决的换行问题(因为这个问题不会在eclipse中发生)(在B(“B”)之后不添加空格)。

是的,罪魁祸首肯定是换行。当我测试你的两个程序时,NetBeans IDE 8.2给了我以下结果。

  1. 第一个矩阵:O和#=6.03秒
  2. 第二个矩阵:O和B=50.97秒

仔细查看你的代码,你在第一个循环的末尾使用了换行符。但是你没有在第二个循环中使用任何换行符。所以你要在第二个循环中打印一个包含1000个字符的单词。这会导致文字包装问题。如果我们在B之后使用非单词字符“”,编译程序只需要5.35秒。如果我们在传递100个值或50个值后在第二个循环中使用换行符,分别只需要8.56秒7.05秒

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");}if(j%100==0){               //Adding a line break in second loopSystem.out.println();}}System.out.println("");}

另一个建议是更改NetBeans IDE的设置。首先,转到NetBeans工具并单击选项。然后单击编辑器并转到格式选项卡。然后在换行选项中选择任何地方。编译程序的时间将减少近6.24%。

NetBeans编辑器设置