根据我可以收集的有关.NET和Java执行环境的信息,目前的情况如下:
现代Java VM能够执行连续重新编译,与分析相结合可以带来很好的性能提升。较旧的JVM使用JIT。 本文中的更多信息: http://www.ibm.com/developerworks/library/j-jtp12214/,尤其是:Java theory and practice: Dynamic compilation and performance measurement
.NET使用JIT或NGEN生成本机代码,但是一旦生成本机代码,就不会执行进一步的(运行时)优化。
除了基准并且无意升级圣战之外,这是否意味着Java Hotspot VM比.Net领先一代。这些在Java VM中使用的技术最终是否会进入.NET运行时?
答案 0 :(得分:15)
他们遵循两种不同的策略。我不认为一个比另一个好。
.NET不解释字节码,因此它必须按照执行的方式对所有内容进行JIT,因此由于时间限制而无法进行大量优化。如果您需要在代码的某些部分进行大量优化,则可以始终手动对其进行NGEN,或者执行快速但unsafe的实现。此外,calling native code is easy。 这里的方法似乎是让运行时足够好并手动优化瓶颈。
现代JVM通常会解释大部分代码,然后对瓶颈进行优化编译。这通常比直接JIT更好,但如果你需要更多,你在Java中没有unsafe
,calling native code is not nice。 所以这里的方法是尽可能多地进行自动优化,因为其他选项并不是那么好。
实际上,与.NET相比,Java应用程序在时间上的表现稍好一些,在空间上表现更差。
答案 1 :(得分:8)
显然有人在为Rotor开展类似工作。我无法访问IEEE,因此无法阅读摘要。
Dynamic recompilation and profile-guided optimisations for a .NET JIT compiler
引自摘要...
使用a评估框架 一组测试程序显示 性能可以最大限度地提高 平均为42.3%和9%。 <强>我们 结果也显示了开销 收集准确的个人资料 通过仪器的信息 在某种程度上超过了 我们的个人资料指导优化 实施,表明需要 用于实现可以的技术 减少这种开销。
答案 2 :(得分:8)
我从未对这两者进行基准比较,而且我对Sun JVM更熟悉,我只能用JIT来概括地说。
总是需要权衡优化,而且并非所有优化都能始终有效。但是,这里有一些现代的JIT技术。如果我们坚持技术性的话,我认为这可以成为一次良好对话的开始:
对于VM的良好实现,还有一些有用的功能:
基于这些功能以及更多功能,我们可以比较虚拟机,而不仅仅是“Java”与“.NET”,而是Sun的JVM与IBM的JVM与.NET与Mono的对比。
例如,Sun的JVM不进行尾部调用优化,IIRC,但IBM确实如此。
答案 3 :(得分:3)
您可能对SPUR感兴趣,它是一个跟踪JIT编译器。重点是javascript,但它在CIL上运行而不是语言本身。这是一个基于Bartok而非标准.NET VM的研究项目。本文有一些性能基准测试,显示'它的执行速度始终高于SPUR-CLR',这是标准的3.5 CLR。然而,没有关于它与当前虚拟机有关的未来的任何公告。跟踪可以跨越方法边界,这不是HotSpot做的AFAIK,JVM跟踪JIT被提到here。
我会犹豫是否说.NET VM是落后的一代,特别是在考虑所有子系统时,特别是泛型。 GC和DLR与invokedynamic的比较我不确定,但在channel9这样的地方有很多关于它们的详细信息。