首页 > Java > 为什么打印“B”比打印“#”慢得多?

为什么打印“B”比打印“#”慢得多?

上一篇 下一篇

我生成了两个 x 矩阵:10001000

第一个矩阵:和 。
第二个矩阵:和 .
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"); //only line changed
        }
    }

    System.out.println("");
}

运行时间差异巨大的原因是什么?


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

正如其他人指出它通常对他们有用一样,例如,我尝试了 Ideone.com,并且两段代码以相同的速度执行。

测试条件:

  • 我从 Netbeans 7.2 运行了此测试,并将输出到其控制台中
  • 我用于测量System.nanoTime()

分割线

网友回答:

我在 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
.
.
.

等等..

总结:

  1. Eclipse 与“B”完美配合
  2. Netbeans 有一个可以解决的换行问题(因为该问题不会出现在 eclipse 中)(无需在 B (“B”)之后添加空格)。

分割线

网友回答:

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

但这纯粹是猜测。

分割线

网友回答:

是的,罪魁祸首绝对是换行。当我测试您的两个程序时,NetBeans IDE 8.2 给了我以下结果。

  1. 第一个矩阵:O 和 # = 6.03 秒
  2. 第二个矩阵: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 工具并单击选项。之后,单击编辑器并转到格式选项卡。然后选择“换行选项中的任意位置”。编译程序所需的时间将减少近 6.24%。

模板简介:该模板名称为【为什么打印“B”比打印“#”慢得多?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 305次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-14
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
自适应 微信公众平台 微信文章 企业网站 响应式 html5 微信素材 微信图片 微信模板 单页式简历模板
您可能会喜欢的其他模板