use*_*300 0 c++ java heap performance allocation
我在Java和C++中运行了一些小测试,创建了大量非常小的对象(没有类成员,构造函数中没有任何东西),而Java显然更快(我的意思是C++似乎非常慢).我敢打赌这与JVM有关,但是以哪种方式?
编辑:
我使用的类是这样的(因为我说没有类成员,在构造函数中没有做任何事)在C++中:
class foo{
public:
foo(){}
~foo(){}
}
Run Code Online (Sandbox Code Playgroud)
在Java中:
public class Foo{
public Foo(){}
}
Run Code Online (Sandbox Code Playgroud)
我做的小测试只是关于在一个循环中分配大量的对象(连续大约1000000000).我在使用Linux的同一台机器上使用了GCC 4.7.2和Java 1.7到OpenJDK的实现.
我敢打赌,它确实与内存池分配有关,这表明JVM拥有不需要的内存.
我仍然感到困惑,因为我认为JVM实际上会更慢,计算指针引用和分配内存.
Cha*_*via 11
在堆上分配许多小对象是Java的运行时通常比C++(在大多数主流实现中)更好地优化的一种情况.每次使用C++分配堆对象时new,实现通常都会对OS进行系统调用(至少在大多数主流平台上如Linux和Windows).在Java中,它通常从JVM提供的内存池进行分配,该内存池是专门为在堆上分配Java对象而设计和优化的.
如果使用特殊的内存池分配器,在大多数情况下C++可能会更快.(另外,C++为您提供了在堆栈上分配对象的选项,当然,这比任何一个都要快得多.)
通常,C++可以为您的程序分配和管理内存提供更细粒度的控制.而JVM受实际Java语言规范的约束,这需要堆分配的对象和垃圾收集.但是,如果您在C++中编写需要在堆上分配许多小对象的应用程序,则可能需要考虑使用内存池分配器.