我生成了两个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”);仍在打印。。。。
正如其他人指出的那样,这对他们来说是正常的,例如,我尝试了Ideone.com,两段代码以相同的速度执行。
试验条件:
我从Netbeans 7.2运行了这个测试,并将输出输入到其控制台我使用System.nanoTime()进行测量
是的,罪魁祸首肯定是文字包装。当我测试您的两个程序时,NetBeansIDE8.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%。
我对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"); \\<-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
.
.
.
等等
摘要:
Eclipse与“B”完美配合Netbeans有一个换行问题可以解决(因为这个问题不会在eclipse中出现)(不需要在B(“B”)后面添加空格)。
是的,罪魁祸首肯定是文字包装。当我测试您的两个程序时,NetBeansIDE8.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%。