Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么JIT-ed语言仍然比原生C/C++;?_Performance_Memory Management_Native_Jit_Machine Code - Fatal编程技术网

Performance 为什么JIT-ed语言仍然比原生C/C++;?

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

解释器需要做很多额外的工作,因此可以理解,它们最终会比本机代码慢很多。但是像C#或Java这样的语言都有JIT编译器,据推测,JIT编译器编译为平台本地机器代码

然而,根据这似乎足够合法的说法,在大多数情况下仍然比C/C++慢2-4倍?当然,我的意思是与同样优化的C/C++代码相比。我很清楚JIT编译的优化好处,以及它们生成代码的能力,这些代码比优化不好的C+C++要快

在所有关于Java内存分配有多好的噪音之后,为什么会有这样的内存使用?在这个特定的基准测试套件中,平均使用的内存是原来的2到50倍,大约是原来的30倍,这没什么可忽视的


请注意,我不想发动战争,我只是想了解定义这些性能和效率数字的技术细节

  • JIT编译器大多编译速度很快,并跳过一些需要较长时间才能找到的优化

  • 虚拟机通常强制执行安全性,这会降低执行速度。例如,除非保证在正确的范围内,否则数组访问总是在.Net中进行边界检查

  • 使用SSE(如果适用的话,性能好)很容易从C++中得到,并且很难从当前的VM

  • 与VM的

    相比,LI>

    性能在C++中比其他方面更为优先

  • 虚拟机通常会在返回操作系统之前保留一段时间未使用的内存,以“使用”更多内存

  • 一些虚拟机生成int/ulong等值类型的对象。。增加对象内存开销

  • 一些虚拟机的自动对齐数据结构浪费了大量内存(为了提高性能)

  • 一些虚拟机将布尔值实现为int(4字节),很少关注内存保护

但是像C#或Java这样的语言都有JIT编译器,据推测,JIT编译器编译为平台本地机器代码

口译员最后还必须翻译成机器代码。但是,为了更好的启动和执行时间,JITters在编译和优化方面花费的精力更少。从用户的角度来看,在编译上浪费时间会使感知性能变差,因此,只有在一次编译中只执行一次这样的操作时,才有可能做到这一点

他们还必须监控编译结果,以进一步重新编译和优化热点,或者对很少使用的路径进行去优化。然后他们不得不偶尔发射一次GC。这些比普通的编译二进制文件花费更多的时间。此外,抖动和抖动程序的大内存使用可能意味着缓存使用效率较低,这反过来也会降低性能

有关内存使用的更多信息,请参考

Java内存使用量比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链表
<> P>大多数情况下,由于Java虚拟机的开销较大、类加载和自动内存调整大小,C++应用程序将消耗比java java应用程序更少的内存。对于内存是选择语言和运行时环境的关键因素的应用程序,需要进行成本/效益分析

还应该记住,使用垃圾收集器的程序可能需要的内存是使用显式内存管理的程序的五倍,才能达到相同的性能

为什么会有如此可怕的内存使用?在这个特定的基准测试套件中,平均使用的内存是原来的2到50倍,大约是原来的30倍,这没什么可忽视的


请参阅

虽然JIT编译器和脱机编译器都必须平衡编译时间和执行速度,但脱机编译器可以在执行速度上取得更大的平衡。+1这是速度部分的一个很好的答案,是否愿意分享一些内存方面的见解?我知道拥有一个GC并为所有东西创建对象有着不平凡的开销。每个对象至少有一个字的开销(GC元数据),更常见的是两个字。