如何在.NET中暂停垃圾收集?

如何在.NET中暂停垃圾收集?,.net,memory-management,garbage-collection,performance,.net,Memory Management,Garbage Collection,Performance,我正在一些处理大量数据的.NET代码上运行一些性能测试。我需要一些测试来确保垃圾收集器不会影响我的结果。如何暂时暂停垃圾回收器?没有通过BCL API实现这一点的方法 为特定算法的分析关闭它也不是一个好主意,因为它会产生错误的结果。垃圾收集器将在程序执行期间运行。如果在现实世界中导致大量垃圾收集,那么不使用GC的评测可能会隐藏算法的实际问题。现实世界将包括垃圾收集。由于这是一个随机到达过程(poisson),因此用蒙特卡罗的方式进行这项工作可能是值得的,可以进行1000次分析运行,并对结果进行平

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

没有通过BCL API实现这一点的方法


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

现实世界将包括垃圾收集。由于这是一个随机到达过程(poisson),因此用蒙特卡罗的方式进行这项工作可能是值得的,可以进行1000次分析运行,并对结果进行平均。

我知道我回答这个问题有点晚了,但是根据MSDN,其中有一个名为
GCSettings.LatencyMode
的属性,可以设置为
LowLatency
。此值将阻止Gen2 GC,除非内存不足或显式调用启动GC。

我看不出有什么意义。在程序的正常执行过程中,垃圾收集器将完成它的工作。因此,您收集的任何数据都是无用的,因为它不能反映应用程序的实际性能。测试你的产品。@Ed Swangren,说得好,我也会这么说。@Ed Swangren你不认为能够比较结果会有助于确定问题区域吗?我不认为测试一个永远不会成为有效用例的场景有什么意义。嗯,我想这对我来说很重要,因为我正在测试一个更大的整体的一部分。垃圾收集器是在“整体级别”上工作的。因此,惩罚这部分性能的度量似乎是不公平的,因为“整体级别”上的系统恰好启动了。这有意义吗?问题是垃圾收集在测试环境和生产环境中的行为不一定相同。我还将结果与问题的非管理方法进行了比较,并认为这些数据对于比较是有价值的。如果您在非管理模式下运行(即完全不同的语言),这是否是一个公平的比较?我不肯定您的意思,但我要说的是:如果其中一个非托管方法使用的是不同的语言,那么惩罚托管方法是否公平,因为在测试期间,运行垃圾收集例程是非常不幸的?不,我不这么认为,因为我对部分比较感兴趣,垃圾收集器是一个整体系统。非托管模式也需要担心内存问题,但在理论上可以更好地优化速度敏感区域。因为非托管模式提供了更可预测的行为和控制,这似乎决定了未来的发展方向。您可以在托管模式下的某些点强制调用垃圾收集器,并查看需要多长时间。也可以使用GC性能计数器。所以,这给了我一个想法。我可以按照您建议的方式运行monte carlo测试,但通过检查之前和之后的GC.CollectionCount,可以排除发生集合的运行。这似乎是一个很好的折衷方案。所以,我完全不了解GC运行的频率!现在我了解了GC收集的频率,我明白了为什么我的问题是沉默的。谢谢大家!!