首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JIT语言仍然比原生C/C++更慢,内存效率更低?

为什么JIT语言仍然比原生C/C++更慢,内存效率更低?
EN

Stack Overflow用户
提问于 2012-08-09 18:55:59
回答 3查看 877关注 0票数 7

解释器做了很多额外的工作,所以可以理解,它们最终比本机代码慢得多。但是像C#或Java这样的语言都有即时编译器,它们应该编译成平台本机代码。

然而,根据benchmarks的说法,在大多数情况下,速度仍然比C/C++慢2-4倍?当然,我的意思是与同等优化的C/C++代码相比。我很清楚JIT编译的优化优势,以及它们生成比优化较差的C+C++更快的代码的能力。

在所有关于Java内存分配有多好的争论之后,为什么要使用这样的horrendous内存呢?在这个特定的基准测试套件中,平均使用了2到50倍的内存,这是不容忽视的……

请注意,我不想挑起战争,我是在询问定义这些性能和效率数字的技术细节。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-09 19:52:04

产生差异的一些原因;

  • 即时编译器通常会快速编译,并跳过一些需要较长时间才能找到的优化。
  • 虚拟机通常会强制执行安全性,这会降低执行速度。例如,阵列访问总是在.Net中进行边界检查,除非保证在正确的范围内
  • 使用SSE (如果适用,性能很好)从C++很容易,从当前的C++获得比其他方面更高的优先级与VM的
  • 相比,VM通常在返回操作系统之前保留一段时间未使用的内存,似乎要使用更多的内存。
  • 一些VM创建值类型的对象,如int/ulong..添加对象内存overhead
  • Some虚拟机的自动对齐数据结构非常浪费内存(为了提高性能)一些虚拟机将布尔值实现为整数(4字节),很少关注memoryconservation.
票数 7
EN

Stack Overflow用户

发布于 2013-08-03 22:32:09

,但是诸如C#或Java之类的语言都有JIT编译器,这些编译器应该编译成平台本机代码。

解释器最终也必须翻译成机器代码。但是为了更好的启动和执行时间,JITters在编译和优化上花费的精力更少。从用户的角度来看,将时间浪费在编译上会使用户感觉到的性能变差,所以只有在像在AoT compiler中这样做一次的情况下才有可能。

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

有关内存使用的更多信息,可以参考here

的内存使用量比C++的内存使用量大得多,这是因为:

  • 中,每个对象有8字节的开销,每个数组有12字节的开销(32位;在64位Java中是12字节的两倍)。如果对象的大小不是8字节的倍数,则向上舍入到8的下一个倍数。这意味着包含单个字节字段的对象占用16个字节,需要4字节的引用。请注意,C++还为每个声明Java库的虚拟functions.
  • Parts的对象分配一个指针(通常为4或8个字节),这些对象必须在程序执行之前加载(至少是程序“在幕后”使用的类).60这导致了需要小型应用程序的大量内存开销。
  • Java二进制和本机重新编译通常都在内存中。
  • 虚拟机本身消耗大量内存。
  • 在Java中,复合对象(使用B和C的实例的A类)是使用对B和C的已分配实例的引用创建的。在C++中,当B和/或C的实例存在于A中时,可以避免这些类型的引用的内存和性能成本。
  • 缺乏地址算法,使得创建内存高效的容器是不可能的,例如紧密分隔的结构和异或链表。

在大多数情况下,由于C++虚拟机、类加载和自动调整内存大小的巨大开销,Java应用程序将比等效的Java应用程序消耗更少的内存。对于内存是在语言和运行时环境之间进行选择的关键因素的应用程序,需要进行成本/收益分析。

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

票数 0
EN

Stack Overflow用户

发布于 2016-05-27 07:19:01

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

请参阅https://softwareengineering.stackexchange.com/a/189552

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11881853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档