Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET:典型的垃圾收集器开销是多少?_C#_.net_Clr - Fatal编程技术网

C# .NET:典型的垃圾收集器开销是多少?

C# .NET:典型的垃圾收集器开销是多少?,c#,.net,clr,C#,.net,Clr,花费在GC上的执行时间的5%?10%? 25% 谢谢。这完全取决于应用程序。垃圾收集是根据需要完成的,因此分配大量内存(这些内存后来变成垃圾)的频率越高,它必须运行的频率就越高 如果你预先分配了所有的东西,并且从不分配任何新的对象,它甚至可以降到0% 在典型的应用中,我认为答案非常接近于0%的时间花在垃圾收集器上。对此进行了有趣的研究 结论是什么?以他的例子来说,开销可以忽略不计 因此,GC堆是如此之快,以至于在一个实际的程序中,即使在紧密的循环中,您也可以使用闭包和委托,而无需花一秒钟的时间(

花费在GC上的执行时间的5%?10%? 25%


谢谢。

这完全取决于应用程序。垃圾收集是根据需要完成的,因此分配大量内存(这些内存后来变成垃圾)的频率越高,它必须运行的频率就越高

如果你预先分配了所有的东西,并且从不分配任何新的对象,它甚至可以降到0%

在典型的应用中,我认为答案非常接近于0%的时间花在垃圾收集器上。

对此进行了有趣的研究

结论是什么?以他的例子来说,开销可以忽略不计

因此,GC堆是如此之快,以至于在一个实际的程序中,即使在紧密的循环中,您也可以使用闭包和委托,而无需花一秒钟的时间(甚至几纳秒的时间)思考。和往常一样,在一个干净、安全的设计上工作,然后通过配置文件找出开销在哪里


正如其他人所说,这要视情况而定。但是,仅供阅读:

另外,我想问你的问题是——你为什么担心开销(或者你只是从学术角度好奇)?如果存在您认为垃圾收集器会影响应用程序性能的特定情况,请询问该情况,您可能会得到更好的响应。否则,还有比垃圾收集器更重要的事情要担心(从性能的角度来看)——首先是您自己的代码/算法等。

观看RedGate的视频。
我遇到的最好的GC解释。

开销变化很大。将问题域简化为“典型场景”并不实际,因为GC(以及相关功能,如终结)的开销取决于几个因素:

  • 应用程序使用的GC风格(影响GC期间线程被阻塞的方式)
  • 您的分配配置文件,包括您分配的频率(当分配请求需要更多内存时,GC会自动触发)和对象的生存期配置文件(第0代收集速度最快,第2代收集速度较慢,如果您导致大量第2代收集,您的开销将增加)
  • 可终结对象的生存期配置文件,因为它们必须先完成终结器,才能符合收集条件
可以分析各个相关轴上的不同点的影响(可能还有更多相关的领域我不想从头回忆起来)——因此问题是“如何将这些相关轴简化为‘常见场景’”


基本上,正如其他人所说,这要视情况而定。或者,“足够低,直到它出现在探查器报告中,您才应该担心它。”

是的,垃圾收集器将花费大约X%的时间在所有应用程序上进行平均收集。但这并不一定意味着时间就是开销对于开销,您实际上只能计算在非托管平台上释放等量内存后剩下的时间。

考虑到这一点,实际开销是负的,但是垃圾收集器将通过批量释放几个内存块来节省时间。这意味着更少的上下文切换和整体效率的提高


此外,从.NET4开始,垃圾收集器在不同的线程上执行大量工作,而不会中断当前运行的代码。随着我们越来越多地使用多核机器,其中一个核心可能时不时处于空闲状态,这是一件大事。

它确实可以变化。看看我写的这个演示程序:


这显示了大型gen2垃圾收集的效果。

在本机C/C++中,有时分配内存的成本非常大,因为找到了大小合适的可用内存块,而释放内存的成本也非常低,因为必须将释放的内存链接到正确的块列表中,并将小块组合成大块

在.NET中,分配一个新对象是非常快的,但是当垃圾收集器运行时,您需要支付费用不过,垃圾收集的短期对象成本几乎是免费的。


我总是发现,如果垃圾收集的成本对你来说是个问题,那么你的软件设计可能会有更大的问题。如果您没有足够的物理RAM,分页可能是任何GC的一个大问题,因此您可能无法将所有数据放在RAM中,并依靠操作系统根据需要提供虚拟内存。

我不知道.NET,但我确信我知道答案:依赖!:)如果您担心.net性能,那么垃圾收集器不应该是您主要的担忧。如果编写算法代码(信号处理、压缩),则可以将C++算法移植到.NET时预期显著减速。在我所看到的例子中,它的速度很容易是原来的两倍多。如果您不这样做,与您等待磁盘访问或花费在非托管库中的时间相比,所有.net开销都是可以忽略的。我知道这在很大程度上取决于内存使用情况,但可能有一些典型的开销预期?@vladimir一个典型的预期是根本不必在意。他的结论非常清楚。他的最后一点是正确的、干净的、安全的代码,然后通过配置文件来发现问题,这可能是最好的建议。要了解实际开销,请加入一些测试和一些内存配置文件。那你肯定知道了。我觉得这篇博文有点误导人。作者正在运行一个单线程测试,并使用简单的开始和结束时间差来“测量”GC开销。实际上,他正在测量lambda的开销,而GC将在另一个线程中运行。(至少我希望它能做到这一点。有人能证实或反驳这一点吗?@sfusseneger,as