为什么打印"B"的速度明显慢于打印"#"?

发布时间 2023-10-30 22:33:11作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=为什么打印"B"的速度明显慢于打印"#"?

我生成了两个1000 x 1000的矩阵:

第一个矩阵: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"); // 只有这一行改变了
        }
    }
                
    System.out.println("");
}

运行时间差异如此之大的原因是什么?


正如评论中建议的那样,只打印System.out.print("#");需要7.8871秒,而System.out.print("B");则给出still printing...

正如其他人指出的那样,在Ideone.com上,这两段代码以相同的速度执行。

测试条件:

  • 我从Netbeans 7.2运行了这个测试,输出到它的控制台
  • 我使用了System.nanoTime()进行测量

纯推测 是你正在使用的终端试图进行文字换行(word-wrapping),而不是字符换行,并将 B 视为一个单词字符,但将 # 视为非单词字符。因此当它到达行的末尾并搜索断开行的位置时,它几乎立即看到了一个 #,并且很高兴在那里断开;而使用 B 时,它必须继续搜索更长的时间,并且可能有更多文本需要换行(在某些终端上可能会很昂贵,例如先输出退格符,然后输出空格来覆盖被换行的字母)。

但这纯粹是推测。