.NET运行时与Java热点:.NET一代落后了吗?

时间:2010-08-02 18:01:11

标签: java .net comparison jit jvm-hotspot

根据我可以收集的有关.NET和Java执行环境的信息,目前的情况如下:

除了基准并且无意升级圣战之外,这是否意味着Java Hotspot VM比.Net领先一代。这些在Java VM中使用的技术最终是否会进入.NET运行时?

4 个答案:

答案 0 :(得分:15)

他们遵循两种不同的策略。我不认为一个比另一个好。

  • .NET不解释字节码,因此它必须按照执行的方式对所有内容进行JIT,因此由于时间限制而无法进行大量优化。如果您需要在代码的某些部分进行大量优化,则可以始终手动对其进行NGEN,或者执行快速但unsafe的实现。此外,calling native code is easy这里的方法似乎是让运行时足够好并手动优化瓶颈

  • 现代JVM通常会解释大部分代码,然后对瓶颈进行优化编译。这通常比直接JIT更好,但如果你需要更多,你在Java中没有unsafecalling 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的良好实现,还有一些有用的功能:

  • 能够在GC之间选择
  • 实现每个GC的自定义
  • 堆分配参数(例如增长)
  • 页面锁定

基于这些功能以及更多功能,我们可以比较虚拟机,而不仅仅是“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是落后的一代,特别是在考虑所有子系统时,特别是泛型。 GCDLR与invokedynamic的比较我不确定,但在channel9这样的地方有很多关于它们的详细信息。