但是 C# 或 Java 等语言有 JIT 编译器,据说可以编译为平台本机机器代码。
最后,口译员还必须翻译成机器代码。但是为了更好的启动和执行时间,JITters 花费更少的精力来编译和优化。从用户的角度来看,在编译上浪费时间会使感知的性能更差,因此只有在AoT 编译器中只执行一次时才有可能。
他们还必须监视编译结果以重新编译和优化热点,或者对很少使用的路径进行反优化。然后他们不得不偶尔触发 GC。这些比正常编译的二进制文件花费更多时间。此外,JITter 和 JITted 程序的大量内存使用可能意味着缓存使用效率较低,这反过来也会降低性能
有关内存使用的更多信息,您可以在此处参考
Java 内存使用量比 C++ 的内存使用量大得多,因为:
- 在 Java 中,每个对象有 8 字节的开销,每个数组有 12 字节的开销(32 位;在 64 位 Java 中是两倍)。如果对象的大小不是 8 字节的倍数,则向上舍入到下一个 8 的倍数。这意味着包含单字节字段的对象占用 16 字节,并且需要 4 字节的引用。请注意,C++ 还为每个声明虚函数的对象分配一个指针(通常为 4 或 8 个字节)。
- Java 库的某些部分必须在程序执行之前加载(至少是程序“在后台”使用的类)。 [60] 这导致小型应用程序的显着内存开销[需要引用]。
- Java 二进制和本机重新编译通常都在内存中。
- 虚拟机本身会消耗大量内存。
- 在 Java 中,使用对已分配的 B 和 C 实例的引用创建复合对象(使用 B 和 C 的实例的类 A)。在 C++ 中,当 B 和 C 的实例时,可以避免这些类型引用的内存和性能成本/ 或 C 存在于 A 中。
- 缺乏地址算法使得创建内存高效的容器(例如紧密间隔的结构和 XOR 链表)成为不可能。
在大多数情况下,由于 Java 的虚拟机、类加载和自动调整内存大小的开销很大,C++ 应用程序将比等效的 Java 应用程序消耗更少的内存。对于内存是在语言和运行时环境之间进行选择的关键因素的应用程序,需要进行成本/收益分析。
还应该记住,使用垃圾收集器的程序可能需要使用显式内存管理的程序的五倍内存才能达到相同的性能。