我生成了1000
x 1000
的两个矩阵:
第一张矩阵:O
和#
第二张矩阵:O
和B
。
使用以下代码,第一个矩阵需要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例如,两段代码都以相同的速度执行。
测试条件:
System.nanoTime()
进行测量答案 0 :(得分:3910)
纯猜测是您使用的终端尝试word-wrapping而不是字符换行,并将B
视为单词字符但{{1作为非单词字符。因此,当它到达一条线的末端并搜索一个断开线的地方时,它几乎立即看到一个#
并且愉快地在那里打破;而对于#
,它必须继续搜索更长时间,并且可能有更多的文本要包装(在某些终端上可能很昂贵,例如,输出退格,然后输出空格来覆盖被包装的字母)。 / p>
但那是纯粹的猜测。
答案 1 :(得分:181)
我在Eclipse vs Netbeans 8.0.2上进行了测试,两者都使用Java版本1.8;
我使用System.nanoTime()
进行测量。
我在两种情况下同时 - 围绕 1.564秒。
因此,看起来Netbeans在打印到控制台时表现不佳。
经过更多研究后,我意识到问题是Netbeans的最大缓冲区line-wrapping(它不限于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
.
.
.
等等..
答案 2 :(得分:7)
是的,罪魁祸首肯定是包装文字。当我测试您的两个程序时,NetBeans IDE 8.2给了我以下结果。
仔细查看代码,您在第一个循环结束时使用了换行符。但是您没有在第二个循环中使用任何换行符。因此,您将在第二个循环中打印一个包含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 loop
System.out.println();
}
}
System.out.println("");
}
另一个建议是更改NetBeans IDE的设置。首先,转到NetBeans 工具,然后单击选项。之后,点击编辑器,然后转到格式标签。然后在换行选项中选择任何地方。编译该程序所需的时间几乎减少了6.24%。