我经常听说c ++比使用垃圾收集器的每种语言“更快”。我不认为这是唯一的原因,但我读到有一点是在c ++中你可以更快地释放内存。
假设只谈论一种语言释放记忆的方式,那么,时间来说,如果你摧毁每个对象,例如在他的范围结束时,或者如果GC选择何时做,那么第一种方式更快?
答案 0 :(得分:2)
确实,垃圾收集者有价格。
例如,他们在Quantifying the Performance of Garbage Collection vs. Explicit Memory Management论文中说:
比较 运行时,空间消耗和虚拟内存占用 在一系列基准测试中,我们展示了运行时性能 性能最佳的垃圾收集器具有明确的竞争力 内存管理给予足够的内存。特别是, 当垃圾收集的内存是其五倍时 根据需要,其运行时性能匹配或稍微超过 显式内存管理。但是,垃圾收集 当它必须使用更小时,性能会大幅下降 堆。内存的三倍,运行速度慢了17% 平均而且内存的两倍,运行速度慢了70%。垃圾 物理时,集合也更容易被分页 记忆稀缺。在这种情况下,所有的垃圾收集器 我们在这里检查遭受数量级的性能惩罚 相对于显式内存管理。
答案 1 :(得分:2)
"更快"是一个非常模糊的概念;实际的物体破坏和记忆的释放将同样快速,但它的煽动。
C ++模型的优点在于它的确定性(破坏发生在已知的时间,而不是每当垃圾收集器转向它时),并且可以减少开销(垃圾收集器需要做一些工作弄清楚哪些对象不再使用了。)
第一点是最重要的:它意味着您可以使用相同的技术来管理所有类型的资源,包括必须在正确的时间发布的锁,而不仅仅是动态分配的对象。
因此,在C ++中,动态对象和锁的行为类似:
{
std::unique_ptr<Thing> thing(new Thing);
do_stuff(thing);
} // automatically destroyed here (if still owned by the pointer)
{
std::unique_lock<std::mutex> lock(mutex);
do_stuff();
} // automatically unlocked here (if still owned by the lock)
虽然假设的垃圾收集语言会以不同的方式对待它们:
{
Thing thing = new Thing;
do_stuff(thing);
} // automatically destroyed at some point, probably
try {
mutex.lock();
do_stuff();
} finally {
mutex.unlock(); // manually unlocked here
}
答案 2 :(得分:1)
这是一个复杂的主题,但我可以展示一些极限情况:
例如,如果你使用C ++而不是c#,你知道内存管理的区别在于内存是免费的
当垃圾收集器(GC)需要它时(对于C#)
当程序员需要它时(对于C ++)
因此,如果您在C ++中创建一个程序,只要您不再需要它就会释放内存,那么内存占用率就会降低,从而带来更多性能。
这假设释放内存的成本很小。
希望有所帮助
答案 3 :(得分:0)
不,由于没有垃圾收集器,C ++不一定更快。
因此,在一个极端情况下,有一些程序可以明确地管理它们的资源使用情况,而垃圾收集器对于这些程序来说会比帮助更容易受到阻碍。另一个极端是一个程序,它对资源管理没有多大帮助,如果有垃圾收集器的帮助,它可能会运行得更好。在这两个极端之间,取决于它。
垃圾收集器的存在确实倾向于鼓励编写不能密切管理其内存的代码。毕竟,垃圾收集器的一个目的是给程序员这样的自由。使用相同的技术,但没有垃圾收集器,往往会导致程序使用(并泄漏!)更多的内存,并且 - 如果执行一段时间 - 运行速度更慢。相反,一个程序编写,因此它明确地管理内存,因为它假设没有垃圾收集器存在,可能不会受益太多,并且可能会受到影响,如果然后引入垃圾收集器。