2

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

编辑:

我使用的类在 C++ 中是这样的(因为我说没有类成员,在构造函数中没有做任何事情):

class foo{
    public:
        foo(){}
        ~foo(){}
}

在 Java 中:

public class Foo{
    public Foo(){}
}

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

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

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

4

1 回答 1

15

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

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

通常,C++ 让您可以更精细地控制程序如何分配和管理内存。而 JVM 受实际 Java 语言规范的限制,需要堆分配对象和垃圾收集。但是,如果您使用 C++ 编写需要在堆上分配许多小对象的应用程序,您可能需要考虑使用内存池分配器。

于 2013-05-15T14:31:16.040 回答