我生成了两个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()进行测量


当前回答

纯粹的推测是,您使用的终端尝试进行单词换行而不是字符换行,并将B视为单词字符,而将#视为非单词字符。因此,当它到达一条线的末端,并寻找一个可以打破这条线的地方时,它会看到一个#几乎立刻就在那里,并很高兴地打破了;而对于B,它必须继续搜索更长的时间,并且可能有更多的文本要换行(这在某些终端上可能很昂贵,例如,输出退格,然后输出空格来覆盖正在换行的字母)。

但这纯属猜测。

其他回答

纯粹的推测是,您使用的终端尝试进行单词换行而不是字符换行,并将B视为单词字符,而将#视为非单词字符。因此,当它到达一条线的末端,并寻找一个可以打破这条线的地方时,它会看到一个#几乎立刻就在那里,并很高兴地打破了;而对于B,它必须继续搜索更长的时间,并且可能有更多的文本要换行(这在某些终端上可能很昂贵,例如,输出退格,然后输出空格来覆盖正在换行的字母)。

但这纯属猜测。

我对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%。