clr! JIT_New在PerfView CPU堆栈中的原因

7

我正在使用PerfView来调优一个应用程序,目前标记为第二昂贵的项是:

其他 < < clr!JIT_New > >

它占用了超过10%的CPU。即使在测试用例的后续运行中,这种情况仍然持续存在。

有人能够确定是哪些活动或代码实践导致了需要JIT编译的新代码的动态生成吗?

1个回答

12
JIT_New()是CLR内部的辅助功能函数,每当您在代码中使用new操作符创建新对象时,它就会运行。它只是从垃圾回收堆中分配内存并调用类构造函数。换句话说,它实现了Opcodes.Newobj IL指令。它的名字有点令人困惑,它与jitting代码没有任何关系。这只是一个Jitter知道的辅助函数,它会将对此帮助程序函数的调用直接编译到生成的机器代码中。JIT_Newarr1()是另一个您可能会遇到的函数,它分配一个数组。
我不了解PerfView,但请注意,JIT_New()的执行时间可能包括执行垃圾回收所需的时间,当JIT_New()运行时gen#0堆已满,这就会导致垃圾回收。这可以解释大部分原因,否则JIT_New()非常快速。您无法做太多事情来改善它,这是任何托管程序中的固定开销。

2
如果您的假设 JIT_New() 包括垃圾回收所需的时间是正确的(我相信是这样的),那么“你无能为力”并不完全正确:在许多情况下,值得在良好的内存分析器下运行程序,并找出如何创建更少的对象(即减少垃圾)。高“% time in GC”性能计数器可能表明编写不良的程序。 - Bradley Grainger
谢谢。我不认为有任何垃圾收集被包含在内;我正在创建大量的小临时对象,我可能能够将它们转换为“struct”。你是否知道在“struct”上实现IEquatable<T>是否会产生装箱开销?最近我看到了一些暗示。 - Pieter Geerkens
经过思考,你可能是正确的。我会查看设计的这个方面。 - Pieter Geerkens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接