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

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

我正在 VS 2012 中使用采样来分析应用程序(尽管分析器并不那么重要)。我对性能瓶颈所在有很好的了解,但是,我受到了以下事实的阻碍:存在大量内存分配,并且垃圾收集器似乎严重扭曲了我的分析(我可以在某种程度上看到 GC 的影响)在 CLR 探查器和并发可视化工具中)。

有没有办法以某种方式消除 GC 运行时采集的样本?我可以使用其中任何一个:

  • 忽略 GC 运行时收集的样本(按函数指针过滤?)
  • GC 所花费的时间和实际工作所花费的时间是分开的
  • 增加 GC 限制以有效“关闭”分析
  • 实际关闭 GC

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

最佳答案

我建议你退后并 try a different approach 。 其工作原理如下:

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

这意味着,如果您只是在 IDE 下运行它,并在等待时手动暂停它,则有 50% 的机会您会在节省的时间内停止它。 通过查看调用堆栈、调用堆栈上的每一行代码以及可能的数据,了解它在做什么以及为什么这样做。

根据您所看到的内容,执行少量操作,例如 5 次、10 次或 20 次。 您将看到它在大约 50% 的样本上执行速度错误,保证

这会告诉您一些探查器不会告诉您的信息,例如:

  • 如果速度问题是您正在执行大量的 new 操作,而您可以通过重复使用对象来避免这些操作,那么它会向您显示具体所在的行发生的情况以及原因。采样分析器可以为您提供行级包含时间,但它无法告诉您花费时间的原因,并且在不知道原因的情况下,您无法确定不需要它。 OTOH,如果样本进入 GC,请忽略它并寻找 new,因为 new 也很昂贵,这就是导致 GC 的原因。

  • 如果速度错误是您实际上正在执行一些文件 I/O 或网络访问,或者沉睡在某些您不知道的库例程中,它会告诉您这一点以及原因,您可以弄清楚解决它。采样分析器不会告诉您这一点,因为它是一个“CPU 分析器”,这意味着只要您的程序被阻止,它就会休眠。如果您切换到仪器化分析仪,它不会为您提供线路级精度。无论哪种方式,它都不会告诉您花费时间的原因。

如果您尝试这样做,您可能不得不忍受一些 mock ,但它会给您带来您想要的结果。 更重要的是,如果您发现并修复了 50% 的速度错误,程序的速度将会提高 2 倍。 这使得更容易发现更多的速度错误。 例如,如果除了 50% 的速度错误之外,最初还存在 25% 的速度错误,现在是 50% 的错误,如果您找到并修复它,您的速度将会提高 4 倍。 令你惊讶的是,你可以一直这样下去,直到你不能再这样做为止,然后你就会接近最佳状态。

关于.net - 在分析(采样)应用程序时忽略 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21828969/

相关文章:

php - PHP 的 gc_enable 函数到底做了什么?

docker - Kubernetes 1.18警告ImageGCFailed错误无法获取imageFs信息: unable to find data in memory cache

java - 使用这些垃圾收集设置的 JVM 性能

c# - 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

c# - 通过 VS 接口(interface)进行表单控制的多个事件处理程序

c++ - 一行中的 Assert::AreEqual 格式消息

mysql - VIsual Studio Express 2012的数据库资源管理器中找不到Mysql数据库

c# - 从 Excel 单元格读取十进制值(在 C# 中)

c# - 序列化类型对象的属性

c++ - 显式默认和删除的构造函数 : is there any similar functionality available in VS2012?