在分析(采样)应用程序时忽略GC

时间:2014-02-17 12:20:21

标签: .net visual-studio-2012 garbage-collection profiling

我正在使用VS 2012中的采样分析应用程序(尽管分析器并不重要)。我在性能瓶颈方面处于领先地位,但是,由于存在大量内存分配这一事实我受到了阻碍,垃圾收集器似乎显着扭曲了我的分析(我可以看到GC效果)在CLR Profiler和Concurrency Visualizer中。)

有没有办法以某种方式摆脱GC运行时获取的样本?我可以使用以下任何一种:

  • 忽略GC运行时收集的样本(按功能指针过滤?)
  • 单独花费GCing的时间和实际工作时间
  • 增加GC限制以有效地“关闭”以进行性能分析
  • 实际关闭GC

问题是我几乎不知道我需要优化什么。通过减少分配等来优化GC的尝试对没有附加调试器的发布版本具有非常低的实际影响,所以我真的想知道有多少分析结果是由于禁用的优化等,以及代码可能有多少有待改进(我们的大部分项目使用了相关代码,因此即使性能提高10%也会产生巨大影响。)

1 个答案:

答案 0 :(得分:3)

我建议你退后并try a different approach。 以下是它的工作原理:

您的计划中存在速度错误。 (很可能没有。) 你找到它并修复它,你将节省一些时间。 假设它是50%。

这意味着如果您只是在IDE下运行它,并在等待它时手动暂停它,那么您有50%的机会在保存时停止它。 通过查看调用堆栈,调用堆栈上的每行代码以及可能的数据,找出它正在做什么以及它为什么这样做。

这样做的次数很少,比如5,10或20,具体取决于你看到的内容。 您将看到它在大约50%的样本上执行速度错误,保证

这将告诉你一些探查器不会做的事情,例如:

  • 如果速度错误是您正在执行许多new s,您可以通过重新使用对象来避免它,它会显示发生这种情况的确切行,以及之所以。采样分析器可以为您提供行级包含时间,但它无法告诉您花费时间的原因,并且不知道您无法确定不需要它的原因。 OTOH,如果样本落在GC中,则忽略它并查找new,因为new也很昂贵,这也是导致GC的原因。

  • 如果速度错误是你实际上正在做一些文件I / O或网络访问或深入睡眠你不知道的一些库例程,它会告诉你这个和为什么,你可以想象绕过它。采样分析器不会告诉您这是因为它是“CPU分析器”,这意味着它会在您的程序被阻止时休眠。如果切换到已检测的探查器,它将不会为您提供行级精度。它不会告诉你花时间的原因。

如果你尝试这个,你可能不得不忍受一些嘲笑,但 会得到你想要的结果。 更重要的是,如果您发现并修复了50%的速度错误,该程序将快2倍。 这样可以更容易地找到速度错误。 例如,如果除了50%之外最初有25%的速度错误,现在它是50%的错误,如果你发现并修复,你将快4倍。 令你惊讶的是,你可以继续这样做,直到你不能再这样做,然后你将接近最佳状态。