在Visual Studio中使用分析器跟踪昂贵的功能时,我偶尔会看到大部分工作最终都在[clr.dll]中。这基本上相当于一个黑盒子,我想知道是否有办法追踪为什么它花了那么多时间。
我认为clr.dll处理诸如JIT编译,加载程序集和管理appdomains,垃圾收集,反射等等之类的东西。但实际上很难确定代码导致它花费这么多时间。
显然除了运行时本身之外还有一些其他代码会导致它在clr.dll中花费那么多时间,那么如何追踪哪些代码有问题呢?
答案 0 :(得分:1)
根据我的经验,它可能在GC中。如果你使用LINQ,它几乎肯定在GC中。我建议使用CLRProfiler来追踪Gen 0垃圾邮件。
答案 1 :(得分:0)
您需要知道代码的哪一部分 - 您可以编辑和编译的代码,这是您可以修复的唯一代码 - 该代码的哪一部分负责使用大部分时间。
知道 clr.dll 使用了很多时间是没有用的,除非你能分辨出代码的哪一部分负责它。
该信息在调用堆栈中。
如果你有一个方法,甚至是一行代码,它在堆栈中占用了一定的时间,例如20%,那么它大约占那个百分比的时间。 如果你能以某种方式消除这一行代码(或者花费更少的时间),那么20%的总时间将变为零,或接近于,从而为你提供1.0 / 0.8的加速因子= 1.25或25%
那你怎么找到这样的线? This is the method I use. 没有人声称它很漂亮,除非总体结果得到赞赏。 如果重复应用large speedup factors are possible。