为什么C++堆分配与 Java 的堆分配相比如此慢?

Why is C++ heap allocation so slow compared to Java's heap allocation?

本文关键字:分配 C++ Java 为什么      更新时间:2023-10-16

我在Java和c++中运行了一些小测试,创建了大量非常小的对象(没有类成员,没有构造函数),Java显然更快(我的意思是c++似乎真的很慢)。我敢打赌这与JVM有关,但是以哪种方式呢?

编辑:

我在c++中使用的类是这样的(正如我所说的没有类成员,在构造函数中不做任何事情):
class foo{
    public:
        foo(){}
        ~foo(){}
}

在Java中:

public class Foo{
    public Foo(){}
}

我做的小测试只是关于在一个循环中分配大量对象(一行大约1000000000个)。我使用GCC 4.7.2和Java 1.7通过OpenJDK实现,两者都在使用Linux的同一台机器上。

我打赌它确实与内存池分配有关,这表明JVM拥有不需要的内存。

我仍然感到困惑,因为我认为JVM实际上会更慢,计数指针引用和分配内存。

在堆上分配许多小对象是Java运行时通常比c++(在大多数主流实现中)更好地优化开箱即用的一种情况。每次在c++中使用new分配堆对象时,实现通常会对操作系统进行系统调用(至少在Linux和Windows等大多数主流平台上是这样)。在Java中,它通常从JVM提供的内存池中进行分配,该内存池是专门为在堆上分配Java对象而设计和优化的。

如果使用特殊的内存池分配器,c++在大多数情况下可能会更快。(此外,c++还提供了在堆栈上分配对象的选项,当然,这比上述任何一种都要快得多。)

一般来说,c++为程序如何分配和管理内存提供了更细粒度的控制。而jvm受到实际Java语言规范的限制,需要堆分配对象和垃圾收集。但是,如果您正在用c++编写需要在堆上分配许多小对象的应用程序,则可能需要考虑使用内存池分配器。