我正在分析关键代码段的时间花费。
//Take a timestamp before
var before = DateTime.UtcNow;
DoCriticalMethod();
//Take a timestamp after
var after = DateTime.UtcNow;
有时我的某些价值明显高于其他价值。
我怀疑它是垃圾收集,所以我想将高值与在此过程中发生垃圾收集的事实相关联。
到目前为止我试过这个: 我之前拿走了柜台:
//Take the number before
int gc2CountBefore = GC.CollectionCount(2);
...
//Take the number after
bool hasgc2occured = (GC.CollectionCount(2) - gc2CountBefore) != 0;
我是否以良好的方式做到了?
答案 0 :(得分:5)
“RegisterForFullGCNotification”方法注册在运行时检测到完整垃圾收集正在接近时引发的通知。此通知分为两部分:完全垃圾收集即将到来以及完整垃圾收集完成时。
要确定何时引发通知,请使用“WaitForFullGCApproach”和“WaitForFullGCComplete”方法。通常,您在while循环中使用这些方法来不断获取显示通知状态的“GCNotificationStatus”枚举。
“WaitForFullGCApproach”和“WaitForFullGCComplete”方法旨在协同工作。使用一个没有另一个可以产生不确定的结果。
答案 1 :(得分:2)
您可以阻止您的应用程序在某个部分进行垃圾收集:
Prevent .NET Garbage collection for short period of time
我会尝试,然后反复分析您的代码。如果你没有看到太大的波动,可能是GC导致它。
答案 2 :(得分:1)
还有一些关于垃圾收集器监视器的StackOverFlow问题:
Monitoring Garbage Collector in C#
底线是启动一个单独的线程并注册到GC事件:
GC.RegisterForFullGCNotification(int,int)
然后您可以等待任何GC活动:
GCNotificationStatus s = GC.WaitForFullGCApproach(10000);
如果有某些活动,您应该收到通知!