我一直在想这个问题.请提供定量数据以支持您的答案.
相关:Windows,Mac和Linux JVM性能之间是否存在显着差异?
Shudo已经完成了比较并发布了像linpack,Scimark等微基准测试的源代码.
linpack的样本结果:
alt text http://www.shudo.net/jit/perf/Linpack-500-P4.png
但最近的更新是在5年多前 - 显然使用的是.NET V1.0或v1.1,而且主要使用的是JVM v1.4.这意味着它在Java和.NET上都有几个过时的版本.您可以获取源并生成自己的结果.
我刚刚这样做了 - 下载了linpack.java和linpack.cs,编译并运行它们.我使用了Sun的Java v1.6.0.11和Microsoft的C#3.0(3.5编译器).两者都在Windows Vista上.
对于linpack问题大小为2000,Java版本为17.6s,C#版本为17.78s.
然后我再次运行它,Java获得18.14s,C#获得17.31.
这说明了性能测量和测试中的一些挑战.
第一:
单一试验不足以得出有意义的结论.通常你应该测量很多试验,然后平均结果.
第二:
你在测量什么?如果您运行单个试验来解决单个问题,那么启动流程的成本将包括在时间,JIT时间以及填充任何缓冲区的任何成本中.这可能是您真正想要衡量的,也可能不是.
在许多情况下,它是您要测量的稳态性能.例如,在服务器进程中,您启动它一次并运行数月.因此,启动成本可以忽略不计,您希望测量和优化的是请求吞吐量给定最小平均响应时间.或者在"胖客户端"中,您想要的是进行视频处理所需的时间,而您不想测量流程启动成本.
第三:
工作量是多少?如果你做了很多浮点数学运算,Linpack和Scimark可能会很有趣.但是如果你不这样做呢?如果您执行大量XML碎化,字符串解析,整数数学,数据库交互或HTML页面生成,该怎么办?如果您的代码执行大量线程管理或使用线程同步原语,该怎么办?通信和IO怎么样?如果交易的关键部分是加密或数字签名创建和验证怎么办?这些基准测试不会告诉您有关其他方案的任何信息.因此,您可以将它们称为微基准测试.
您需要一个能够正确建模您要评估的内容的基准.
另请参阅:
作为语言基准的琐碎数学问题