java为什么比c_为什么Java在这种情况下比C更快(也更慢)?

一些学生刚刚开始通过阅读K& R开始学习C,并提出了在第一页打印出来的华氏 - 电子转换循环:

#include

main ()

{

int fahr;

for (fahr = 0; fahr<= 200000000; fahr = fahr + 20)

printf("%d\t%6.2f\n", fahr, (5.0 / 9.0) * (fahr-32));

}他被告知Java缓慢。所以,告诉他现在Java非常具有竞争力,但是在这种简单情况下C可能会更快。想要证明他并基本上添加了“System.out”。在printf()的前面。

它慢了10倍以上。太多了。我很困惑。思考String对象的创建,GC,-server,yada,yada,yada。

当我发现几乎100%的时间实际用在printf()(PrintSteam.write(),输出到/ dev / null)时,我更加困惑。

经过一番捣鼓之后,我想到了这一点(现在还没有做%f的四舍五入):

public static void main(String... args) throws Exception {

int fahr=0;

PrintWriter out = new PrintWriter(Channels.newWriter(Channels.newChannel(System.out), "US-ASCII") );

int max = 2000000000;

for (fahr = 0; fahr<= max; fahr = fahr + 20)

// out.printf("%d\t%6.2f\n", fahr, (5.0 / 9.0) * (fahr-32));

out.println( fahr + "\t" + f(((5.0 / 9.0) * (fahr-32)) ));

out.close();

}

private static final String f(double d) {

return (int)d + "." + (int)((d - (int)d)*100);

}

}所以,这使用NIO。在两台测试过的机器上它的性能优于gcc -O2。

问题:

为什么从C到Java的文字转义(即PrintStream)如此缓慢?

(为什么评论out.printf()这么慢[也许性能会随着时间的推移而降低]?)

最后:为什么我的解决方案比C更快(包括JVM启动时间)?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值