Java VM 与 .NET CLR 上的基准测试性能

2022-09-01 06:07:18

您是否曾经不得不根据性能来证明使用.NET而不是Java的选择是合理的?

对于可以执行以下操作的典型高容量事务处理系统,

  • 并发数据库事务
  • 数学计算
  • 与其他 Web 服务(SOAP/XML、XML-RPC)的交互

我的方法是在Java中为JVM和C#为.NET CLR编写基准测试,以便在各种负载级别下对上述操作进行基准测试并比较结果。

撇开语言和平台偏好不谈,我很想听听您将如何在Java VM和.NET CLR之间进行结论性的性能比较

是否有任何全面和受人尊敬的基准?


答案 1

我没有关于JVM与CLR效率的确切数字,但差异(如果有的话)可能很小。

但是,在语言方面,C#确实比Java具有一些更低级的构造,这将允许更多的优化。

构造如下:

  • 用户定义的值类型。快速分配,没有内存开销(如果我没记错的话,CLR和JVM中每个引用类型都是12个字节)。对于让自己自然地表示为值的东西很有用,比如向量和矩阵。所以数学运算。将其与这些大值类型结合使用,以避免过度复制这些大值类型。refout

  • 不安全的代码块,允许更“接近金属”的优化。例如,虽然 CLR 和 JVM 在某些情况下可以避免数组边界检查,但在很多情况下,它们不能,并且每次数组访问都需要检查索引是否仍在数组的边界内。在这里使用不安全的代码允许您使用指针直接访问数组的内存,并规避任何边界检查。这可能意味着节省大量成本。在非常低级的一侧,还允许您直接在堆栈上分配数组,而普通数组则分配在堆上,这更慢,但也更方便。我个人不知道任何实际应用。stackallocstackalloc

  • 真正的泛型,与Java的类型擦除泛型不同,避免了不必要的转换和装箱。但是,如果这是Java程序中的一个问题,则可以通过一些额外的工作(例如从a切换到内部使用缓冲区的自定义类型)轻松解决。ArrayList<Integer>int[]

这一切似乎都偏向于C#,我确实认为C#有更好的低级语言结构可以帮助提高性能。但是,我怀疑这些差异是否真的重要(它们甚至可能不适用于您的情况,如果您所做的只是数据库访问,那么使用指针对您没有任何好处,而Java可能更快),如果选择以其他方式(例如跨平台)阻碍您)。追求正确性,符合您要求的平台,而不是微小的性能差异。


答案 2

Java VM 和 .Net CLR 之间的最终性能比较是一个白日梦。您始终可以进行性能测试,使一个看起来比另一个更好,因为设计一个复杂的系统总是涉及妥协。如果您将基准测试的类型缩小到运行时速度和内存,您可能会发现这样的文章:http://www.codeproject.com/KB/dotnet/RuntimePerformance.aspx 这绝不是辩论的结束。


推荐