执行时间中有5%花费在垃圾回收上?10%?25%?
谢谢。
这完全取决于应用程序。垃圾回收是按需执行的,因此您分配大量内存并且这些内存后来变成垃圾的次数越多,它就必须运行得越频繁。
如果您预先分配了所有内容并且从未分配任何新对象,甚至可以降至0%。
在典型的应用程序中,我认为花费在垃圾回收器上的时间非常接近0%。
这篇博客文章对此领域进行了有趣的调查。
那么,作者的结论是什么呢?他的例子中开销微不足道。
因此,在真正的程序中,即使在紧密循环中,GC堆的速度也是如此之快,以至于您可以毫不犹豫地使用闭包和委托(甚至不需要思考几个纳秒)。与往常一样,先从一个干净、安全的设计开始工作,然后通过剖析找出开销所在。
是的,垃圾回收器会在所有应用程序中平均花费一定比例的时间进行垃圾收集。但这并不一定意味着这些时间是额外开销。
对于额外开销,你只能计算在非托管平台上释放相同数量内存后剩余的时间。
考虑到这一点,实际的额外开销是负数的,因为垃圾回收器会以批量释放多个内存块的方式来节省时间。这意味着较少的上下文切换和整体效率的提升。
此外,从.NET 4开始,垃圾回收器会在一个不太打断当前运行代码的不同线程上进行大部分工作。随着我们越来越多地使用多核机器,其中某个核心可能会偶尔空闲,这是一个重要的改进。
这可能会有所不同。看看我写的这个演示短而完整程序:
http://nomorehacks.wordpress.com/2008/11/27/forcing-the-garbage-collector/
这显示了大型Gen2垃圾收集的效果。