【问题标题】:How to pause Garbage Collection in .NET?如何在 .NET 中暂停垃圾收集?
【发布时间】:2009-09-24 17:38:36
【问题描述】:

我正在对一些处理大量数据的 .NET 代码进行性能测试。我想要一些测试来确保垃圾收集器不会影响我的结果。如何临时暂停垃圾收集器?

【问题讨论】:

  • 我不明白这一点。在程序的正常执行中,垃圾收集器将做它的事情。因此,您在未完成工作时收集的任何数据都是无用的,因为它不能反映应用程序的实际性能。测试您发布的内容。
  • @Ed Swangren,说得好,我要表达同样的观点。
  • @Ed Swangren 你不认为能够比较结果有助于识别问题区域吗?
  • 我看不出测试一个永远不会成为有效用例的场景的意义。
  • 嗯,我想这对我来说很重要,因为我正在测试一个更大的整体的一部分。垃圾收集器在“整个级别”工作。因此,惩罚对这部分性能的测量似乎不公平,因为“整个级别”的系统碰巧启动了。这有意义吗?

标签: .net memory-management garbage-collection performance


【解决方案1】:

无法通过 BCL API 执行此操作。

在分析特定算法时关闭它也不是一个好主意,因为它会产生错误的结果。垃圾收集器将在程序执行期间运行。如果在现实世界中导致大量垃圾收集,那么在没有 GC 的情况下进行分析可能会隐藏算法的实际问题。

【讨论】:

  • 所以,我完全不理解 GC 运行的频率!现在我了解了 GC 收集的频率,我明白了为什么我的问题是无声的。谢谢大家!
【解决方案2】:

我知道我回答这个问题有点晚了,但根据 MSDN http://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.latencymode.aspx,其中一个名为 GCSettings.LatencyMode 的属性可以设置为 LowLatency。此值将阻止 Gen2 GC,除非存在内存不足或显式调用以启动 GC。

【讨论】:

    【解决方案3】:

    现实世界将包括垃圾收集。由于这是一个随机到达过程(泊松),因此可能值得以 monte carlo 方式执行此操作并执行几 1000 次分析运行并对结果取平均值。

    【讨论】:

    • 问题是垃圾收集在测试环境和生产环境中的行为不一定相同。我还将结果与解决问题的非托管方法进行比较,并认为这些数据对于比较是有价值的。
    • 如果您在非托管模式下运行 - 即完全不同的语言,这将是一个公平的比较吗?
    • 我不肯定你在说什么,但我会说:如果其中一种非托管方法使用不同的语言,那么惩罚托管方法是否公平,因为在测试期间它是不幸地运行垃圾收集例程?不,我不这么认为,因为我对部分的比较感兴趣,而垃圾收集器是一个整体的系统。非托管方法也必须担心内存,但能够更好地优化速度敏感区域(理论上)。
    • 由于非托管模式为您提供了更多可预测的行为和控制,这似乎是未来的选择。您可以在托管模式下的某些时间点强制调用垃圾收集器并查看需要多长时间。还有可以使用的GC性能计数器blogs.msdn.com/maoni/archive/2004/06/03/148029.aspx
    • 所以,这给了我一个想法。我可以按照您的建议运行测试蒙特卡罗时尚,但通过检查前后的 GC.CollectionCount 来丢弃发生集合的运行。这似乎是一个很好的妥协。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2012-07-16
    相关资源
    最近更新 更多