我没有关于JVM与CLR效率的确切数字,但差异(如果有的话)可能很小。
但是,在语言方面,C#确实比Java具有一些更低级的构造,这将允许更多的优化。
构造如下:
用户定义的值类型。快速分配,没有内存开销(如果我没记错的话,CLR和JVM中每个引用类型都是12个字节)。对于让自己自然地表示为值的东西很有用,比如向量和矩阵。所以数学运算。将其与这些大值类型结合使用,以避免过度复制这些大值类型。ref
out
不安全的代码块,允许更“接近金属”的优化。例如,虽然 CLR 和 JVM 在某些情况下可以避免数组边界检查,但在很多情况下,它们不能,并且每次数组访问都需要检查索引是否仍在数组的边界内。在这里使用不安全的代码允许您使用指针直接访问数组的内存,并规避任何边界检查。这可能意味着节省大量成本。在非常低级的一侧,还允许您直接在堆栈上分配数组,而普通数组则分配在堆上,这更慢,但也更方便。我个人不知道任何实际应用。stackalloc
stackalloc
真正的泛型,与Java的类型擦除泛型不同,避免了不必要的转换和装箱。但是,如果这是Java程序中的一个问题,则可以通过一些额外的工作(例如从a切换到内部使用缓冲区的自定义类型)轻松解决。ArrayList<Integer>
int[]
这一切似乎都偏向于C#,我确实认为C#有更好的低级语言结构可以帮助提高性能。但是,我怀疑这些差异是否真的重要(它们甚至可能不适用于您的情况,如果您所做的只是数据库访问,那么使用指针对您没有任何好处,而Java可能更快),如果选择以其他方式(例如跨平台)阻碍您)。追求正确性,符合您要求的平台,而不是微小的性能差异。