在“发布”构建模式下进行性能分析时,生成的代码是否真的经过“发布-构建模式”优化?

时间:2018-11-13 23:00:52

标签: c# .net visual-studio profiling

我想知道:当.Net在Release版本中生成的堆栈跟踪引发异常时,行号经常关闭,而且在分析源代码时应该存在的某些堆栈框架甚至都没有打印出来,因为它们-被优化了。

因此,当Visual Studio说在CPU对发行版本进行采样时,方法X花费了很多时间时,这种方法是否值得信任?或者由于优化也可以取消?

1 个答案:

答案 0 :(得分:0)

探查器不在乎是以发布模式还是调试模式构建代码。无论发出什么代码,它都会对其进行概要分析。概要分析的主要目的是测量与性能相关的各种指标并找到瓶颈。因此,将探查器设计为具有最小的侵入性,以便能够进行足够准确的测量。通常,您需要分析优化的代码,因为这是在生产系统上使用的代码。

关于堆栈跟踪,某些堆栈帧可能丢失的原因通常是由于方法内联,这是JIT编译器执行的重要优化。因此,如果A调用B,然后又调用C,并且JIT编译器将B内联到A,那么调用堆栈将向您显示A调用C,即使B在源代码中也没有帧。另外,由于探查器没有足够的调试信息,因此可能缺少一些堆栈框架,因此无法完全遍历堆栈。同样,源代码行号可能不匹配,因为JIT编译器可能会重新排列代码或删除一些代码段,从而很难在本机代码和源代码之间进行准确映射。因此,您最终将看到一个近似映射。