clr的原因! PerfView CPU 堆栈中的 JIT_New
Posted
技术标签:
【中文标题】clr的原因! PerfView CPU 堆栈中的 JIT_New【英文标题】:Causes of clr ! JIT_New in PerfView CPU stack 【发布时间】:2013-06-04 01:48:48 【问题描述】:我正在使用 PerfView 来调整应用程序,第二个最昂贵的项目当前标记为:
其他 >
超过 10% 的 CPU。即使对于测试用例的后续运行,这种情况也会继续。
谁能确定哪些活动或代码实践可能导致需要 JIT-ting 的新代码的动态生成?
【问题讨论】:
【参考方案1】:JIT_New() 是 CLR 中的一个辅助函数,只要您使用 new 运算符在代码中创建新对象,该函数就会运行。它只是从垃圾收集堆中分配内存并调用类构造函数。或者换句话说,它实现了 Opcodes.Newobj IL 指令。它的名字有点令人困惑,它与 jitting 你的代码没有任何关系。 jitter 知道的只是一个辅助函数,它将对这个辅助函数的调用直接编译成生成的机器代码。 JIT_Newarr1() 将是您遇到的另一个,它分配一个数组。
我不知道 PerfView,请注意 JIT_New() 的执行时间可能包括执行垃圾回收所需的时间。当 JIT_New() 运行时 gen#0 堆已满时会发生这种情况。这可以解释很大的百分比,否则 JIT_New() 非常快。您对此无能为力,这是任何托管程序中的固定开销。
【讨论】:
如果您认为JIT_New()
包括垃圾收集所用时间的假设是正确的(我相信它是正确的),那么严格来说,“您对此无能为力”并不完全正确:在在很多情况下,值得在良好的memory profiler 下运行程序并弄清楚如何创建更少的对象(即更少的垃圾)。较高的“% time in GC”性能计数器可能表明程序编写不佳。
谢谢。我不相信任何垃圾收集包括在内;我正在创建大量小的临时对象,我可能可以将它们转换为 struct
s。您是否知道在结构上实现 IEquatable以上是关于clr的原因! PerfView CPU 堆栈中的 JIT_New的主要内容,如果未能解决你的问题,请参考以下文章
全能程序员系列(十三)--性能分析工具PerfView的使用
PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?
PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化