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

标签 performance memory-management native jit machine-code

解释器做了很多额外的工作,所以它们最终比本地机器代码慢很多是可以理解的。但是 C# 或 Java 等语言有 JIT 编译器,据说可以编译为平台本地机器代码。

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

毕竟关于 Java 内存分配有多好的噪音,为什么这样 horrendous内存使用情况? 2 到 50 倍,平均大约 30 倍以上的内存在特定的基准测试套件中使用,这没什么可小瞧的......

请注意,我不想启动 WAR,我询问的是定义这些性能和效率数据的技术细节。

最佳答案

产生差异的一些原因;

  • JIT 编译器大多编译速度快,并跳过一些需要更长时间才能找到的优化。
  • VM 通常会强制执行安全性,这会减慢执行速度。例如。除非保证在正确的范围内,否则数组访问始终在 .Net 中进行边界检查
  • 在 C++ 中使用 SSE(如果适用,可以提高性能)很容易,而在当前 VM 中很难使用
  • 与 VM 的
  • 相比,C++ 中的性能比其他方面更重要。
  • 虚拟机通常会在返回操作系统之前保留一段时间未使用的内存,似乎“使用”更多内存。
  • 一些 VM 生成值类型的对象,如 int/ulong.. 增加对象内存开销
  • 一些 VM 的自动对齐数据结构会浪费大量内存(为了提高性能)
  • 一些 VM 将 bool 值实现为 int(4 字节),很少关注内存保护。
  • 关于performance - 为什么 JIT 语言仍然比原生 C/C++ 更慢且内存效率更低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11881853/

    相关文章:

    c# - 访问数组时的速度差异

    windows - C/C++程序中怎么会有静态地址?

    c# - 将列表克隆到现有列表中、最小化内存重新分配的最有效方法?

    android - 如何将 Activity 转换为 fragment 以在抽屉中使用

    linux - perl 脚本执行时间非常慢

    android - 自动填充数据库。(Android/新手)

    使用具有复杂检查的局部变量的多个 && 的 C# 性能 - 编码风格与性能

    c++ - 设置数组元素时发生 MSVC 访问冲突

    javascript - 扩展 JavaScript 错误/异常

    c - STATUS_PENDING 是什么意思?