提问人:Kuba Spatny 提问时间:2/22/2014 最后编辑:Dmitriy PopovKuba Spatny 更新时间:7/5/2023 访问量:256657
为什么打印“B”比打印“#”慢得多?
Why is printing "B" dramatically slower than printing "#"?
问:
我生成了两个 x 矩阵:1000
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,并且两段代码以相同的速度执行。
测试条件:
- 我从 Netbeans 7.2 运行了此测试,并将输出到其控制台中
- 我用于测量
System.nanoTime()
答:
纯粹的推测是,您正在使用一个终端,该终端尝试进行自动换行而不是字符换行,并被视为单词字符但被视为非单词字符。因此,当它到达一条线的尽头并寻找一个突破线的地方时,它几乎立即看到一条线并愉快地在那里断线;而使用 ,它必须继续搜索更长的时间,并且可能有更多的文本要换行(这在某些终端上可能很昂贵,例如,输出退格,然后输出空格以覆盖正在换行的字母)。B
#
#
B
但这纯粹是猜测。
评论
System.out.println
System.out.println
我在 Eclipse 和 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"); // <- contains 1000 "B"s
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
.
.
.
等等。
总结:
- Eclipse 与“B”完美配合
- Netbeans 有一个可以解决的换行问题(因为该问题不会在 eclipse 中发生)(无需在 B (“B”) 后面添加空格)。
评论
是的,罪魁祸首绝对是换行。当我测试您的两个程序时,NetBeans IDE 8.2 给了我以下结果。
- 第一个矩阵:O 和 # = 6.03 秒
- 第二个矩阵: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 loop
System.out.println();
}
}
System.out.println("");
}
另一个建议是更改 NetBeans IDE 的设置。首先,转到 NetBeans Tools,然后单击 “Options”(选项)。之后,单击“编辑器”,然后转到“格式”选项卡。然后选择“换行选项中的任意位置”。编译程序所需的时间将减少近 6.24%。
评论