Nor*_*löw 70 c++ performance garbage-collection d heap-memory
我最近看到两个非常好的和教育性的语言谈话:
Herb Sutter的第一部,介绍了C++ 0x的所有优秀和酷炫功能,为什么C++的未来比以往任何时候都更加明亮,以及M $如何在这场游戏中成为一个好人.该演讲围绕效率展开,如何最大限度地减少堆活动可以提高性能.
这个另一种,安德烈Alexandrescu的,激励一个过渡从C/C++,以他的新的游戏改变d.D的大部分内容似乎都非常有动力和设计.然而,有一件事让我感到惊讶,即D推动垃圾收集,并且所有类都是通过引用创建的.更令人困惑的是,"D编程语言参考手册 "一书特别在关于资源管理的部分中 陈述如下,引用:
垃圾收集消除了C和C++中必需的繁琐,容易出错的内存分配跟踪代码.这不仅意味着更快的开发时间和更低的维护成本,而且最终的程序经常运行得更快!
这与Sutter关于最小化堆活动的不断讨论相冲突.我非常尊重Sutter和Alexandrescou的见解,所以我对这两个关键问题感到有些困惑
不通过引用单独创建类实例会导致很多不必要的堆活动吗?
在哪些情况下我们可以使用垃圾收集而不牺牲运行时性能?
dsi*_*cha 45
直接回答你的两个问题:
是的,通过引用创建类实例确实会导致很多堆活动,但是:
一个.在d,你struct
还有class
.A struct
具有值语义,可以做除了多态之外的所有类.
湾 由于切片问题,多态性和值语义从未一起很好地协同工作.
C.在D中,如果你真的需要在一些性能关键的代码中在堆栈上分配一个类实例而不关心安全性的损失,那么你可以通过该scoped
函数没有不合理的麻烦.
如果符合以下条件,GC可以与手动内存管理相媲美或更快
一个.您仍然尽可能在堆栈上进行分配(正如您在D中所做的那样),而不是依赖堆来处理所有事情(正如您在其他GC语言中经常做的那样).
湾 你有一个顶级的垃圾收集器(D的当前GC实现虽然在过去的几个版本中已经看到了一些重大的优化,但它并没有那么糟糕).
C.你主要分配小对象.如果你主要分配大型数组并且性能最终成为一个问题,你可能想要将其中一些切换到C堆(你可以访问C的malloc并在D中释放),或者,如果它有一个范围的生命周期,其他一些像RegionAllocator这样的分配器.(RegionAllocator目前正在讨论和改进,最终包含在D的标准库中).
d.你对空间效率并不在乎.如果过于频繁地运行GC以使内存占用空间保持在极低水平,性能将受到影响.
Jac*_*nds 22
在堆上创建对象的原因比在堆栈上创建对象要慢,因为内存分配方法需要处理堆碎片之类的事情.在堆栈上分配内存就像递增堆栈指针一样简单(恒定时间操作).
然而,使用压缩垃圾收集器,您不必担心堆碎片,堆分配可以像堆栈分配一样快.D编程语言的垃圾收集页面更详细地解释了这一点.
GC语言运行速度更快的断言可能假设许多程序在堆上分配内存的频率比在堆栈上分配更多.假设在GC语言中堆分配可能更快,那么你就可以优化大部分程序的大部分(堆分配).
xto*_*ofl 13
答案1):
只要你的堆是连续的,分配它就像在堆栈上分配一样便宜.
最重要的是,当您分配彼此相邻的对象时,您的内存缓存性能将会很好.
只要您不必运行垃圾收集器,就不会丢失性能,并且堆保持连续.
这是个好消息:)
回答2):
GC技术发展很快; 他们甚至现在都有实时的味道.这意味着保证连续内存是一个策略驱动的,依赖于实现的问题.
因此,如果
您最终可能会获得更好的表现.
回答未提出的问题:
如果开发人员摆脱内存管理问题,他们可能有更多时间花在代码中的实际性能和可伸缩性方面.这也是一个非技术因素.