Performance 为什么JIT-ed语言仍然比原生C/C++;?
解释器需要做很多额外的工作,因此可以理解,它们最终会比本机代码慢很多。但是像C#或Java这样的语言都有JIT编译器,据推测,JIT编译器编译为平台本地机器代码 然而,根据这似乎足够合法的说法,在大多数情况下仍然比C/C++慢2-4倍?当然,我的意思是与同样优化的C/C++代码相比。我很清楚JIT编译的优化好处,以及它们生成代码的能力,这些代码比优化不好的C+C++要快 在所有关于Java内存分配有多好的噪音之后,为什么会有这样的内存使用?在这个特定的基准测试套件中,平均使用的内存是原来的2到50倍,大约是原来的30倍,这没什么可忽视的Performance 为什么JIT-ed语言仍然比原生C/C++;?,performance,memory-management,native,jit,machine-code,Performance,Memory Management,Native,Jit,Machine Code,解释器需要做很多额外的工作,因此可以理解,它们最终会比本机代码慢很多。但是像C#或Java这样的语言都有JIT编译器,据推测,JIT编译器编译为平台本地机器代码 然而,根据这似乎足够合法的说法,在大多数情况下仍然比C/C++慢2-4倍?当然,我的意思是与同样优化的C/C++代码相比。我很清楚JIT编译的优化好处,以及它们生成代码的能力,这些代码比优化不好的C+C++要快 在所有关于Java内存分配有多好的噪音之后,为什么会有这样的内存使用?在这个特定的基准测试套件中,平均使用的内存是原来的2到5
请注意,我不想发动战争,我只是想了解定义这些性能和效率数字的技术细节
- JIT编译器大多编译速度很快,并跳过一些需要较长时间才能找到的优化
- 虚拟机通常强制执行安全性,这会降低执行速度。例如,除非保证在正确的范围内,否则数组访问总是在.Net中进行边界检查
-
使用SSE(如果适用的话,性能好)很容易从C++中得到,并且很难从当前的VM
与VM的相比,LI> - 虚拟机通常会在返回操作系统之前保留一段时间未使用的内存,以“使用”更多内存
- 一些虚拟机生成int/ulong等值类型的对象。。增加对象内存开销
- 一些虚拟机的自动对齐数据结构浪费了大量内存(为了提高性能)
- 一些虚拟机将布尔值实现为int(4字节),很少关注内存保护
性能在C++中比其他方面更为优先
- 在Java中,每个对象的开销为8字节,每个数组的开销为12字节(32位;在64位Java中为两倍)。如果对象的大小不是8字节的倍数,则它将向上舍入到下一个8字节的倍数。这意味着包含单字节字段的对象占用16个字节,需要4字节的引用。请注意,C++还为每个声明虚函数的对象分配一个指针(通常为4或8字节)。
- Java库的某些部分必须在程序执行之前加载(至少是程序“隐藏”使用的类)。[60]这会导致小型应用程序的大量内存开销[需要引用]
- Java二进制和本机重新编译通常都在内存中
- 虚拟机本身消耗大量内存
- 在java中,使用引用的实例来创建一个复合对象(使用B和C实例的类A)。C++中,当B和/或C的实例存在于. 中时,可以避免这些类型的引用的内存和性能开销。
- 由于缺乏地址算法,无法创建内存高效的容器,如紧间隔结构和XOR链表
请参阅虽然JIT编译器和脱机编译器都必须平衡编译时间和执行速度,但脱机编译器可以在执行速度上取得更大的平衡。+1这是速度部分的一个很好的答案,是否愿意分享一些内存方面的见解?我知道拥有一个GC并为所有东西创建对象有着不平凡的开销。每个对象至少有一个字的开销(GC元数据),更常见的是两个字。