gpt4 book ai didi

.net - 如何减少花费在 GC 上的时间

转载 作者:行者123 更新时间:2023-12-04 08:14:31 24 4
gpt4 key购买 nike

我正在创建一个桌面应用程序,该应用程序具有可能运行几秒钟的计算繁重的操作。显然,需要最小化该操作的时间。该操作相当容易并行化(单个子任务),每个子任务在单个线程上大约需要 50 毫秒。在多线程上,每个子任务花费的时间是 4-5 倍,因为 40-50% 的时间花在 GC 上,有效地完全取消了加速。

所以我需要减少 GC 的工作量。我的第一个想法是尝试找出最常被垃圾回收的对象类型,但我意识到虽然我经常进行内存分析,但我从未搜索过这样的模式。通常查看堆快照或堆快照之间的差异,但这些显示的是事件的对象,而不是在这些快照之间创建和处置的对象。所以这是我的第一个问题:找到哪些类型被创建和垃圾收集最多的最简单方法是什么?我尝试查找方法调用计数,以查看是否经常可疑地调用某个构造函数,但以数百万创建的所有对象都只是小型结构类型。如果我理解正确,即使装箱,这些也不应该对 GC 产生影响?

该算法创建了数十万个单独的结果点对象。这些当然不应该被 gc'd 因为它们代表操作的输出。但这引出了我的第二个问题:在 GC 中花费的时间主要取决于对象的总数还是主要取决于实际收集的对象的数量?我应该尝试限制结果对象的数量,而是使用更少但更大的结果对象吗?

编辑:我通过使用 VS 2010 并发可视化工具发现了在 GC 中花费的时间。此外,在并行代码中,大部分阻塞线程都在等待 gc

编辑:我应该澄清性能问题是因为在工作站 GC 上有效地序列化了执行。例如,参见这篇文章中描述的性能问题。

http://blogs.msdn.com/b/hshafi/archive/2010/06/17/case-study-parallelism-and-memory-usage-vs2010-tools-to-the-rescue.aspx

对于阻塞我的线程的垃圾收集器我无能为力(而且我不认为我想要桌面应用程序的服务器 GC,对吗?)。所以为了得到这个操作的线性加速,我需要减少调用 GC 的次数。浪费的大部分时间实际上是被其他线程阻塞等待一个线程进行 GC 所浪费的。

最佳答案

就个人而言,如果您的任务只需要 50 毫秒来执行,那么线程创建等的开销将比您的实际工作花费更多的时间,这就是您所看到的。因此,您可能无法深入了解它。

至于看看那里有什么,我用过的最好的工具是 ANTS Profiler(内存和性能)。从那里你可以看到内存中的对象,时间点之间的差异以及“执行次数”,这应该会让你得到你想要的。

关于.net - 如何减少花费在 GC 上的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com