【发布时间】:2013-05-10 04:32:51
【问题描述】:
我在 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 实际上会更慢,计算指针引用和分配内存。
【问题讨论】:
-
这个问题无法回答。这取决于 C++ 编译器、JVM 版本、基准程序、平台……
-
Hotspot(我假设您正在使用)是一个优化运行时。对象内存分配现在如此之快,几乎被认为是免费的。但是,我没有看到您的 C++ 代码或您使用的编译器实现,因此我无法评论它的优化程度。
-
你不是在这里比较苹果和苹果。对于这种情况,JVM 使用预先分配的内存池。 C++ 没有针对这种结构的预构建功能,而是向操作系统内存管理器查询 every 分配。人们用 C++ 编写一个提供 JVM 在这里所做的事情(内存池分配器)的系统并不少见。此外,这是一个合法的问题,所有的反对票都是 BS。
-
虽然它可以受益于关于测试的具体实现和对它们进行的测试的更多细节,但这是一个最合理的问题 - 特别是,尽管有一些变体,两种语言的实现足够同质,只需少量警告即可回答问题。
-
@Dave 我认为典型的 C++ 实现不会要求操作系统进行每次分配。
malloc和new有许多限制,这使得许多优化不可行,但至少 C 或 C++ 运行时库可以从操作系统分配更大的内存块,并为大多数分配分配内存块。
标签: java c++ performance heap-memory allocation