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

Pie*_*ens 6 .net c# performance perfview

我使用PerfView调整应用程序,第二个最昂贵的项目目前标记为:

其他<< clr!JIT_New >>

占CPU的10%以上.即使对于后续运行的测试用例,这仍然存在.

任何人都可以确定哪些活动或代码实践可能导致动态生成需要JIT-ting的新代码?

Han*_*ant 11

JIT_New()是CLR中的一个辅助函数,只要您使用new运算符在代码中创建新对象,它就会运行.它只是从垃圾收集堆中分配内存并调用类构造函数.或者换句话说,它实现了Opcodes.Newobj IL指令.它的名字有点令人困惑,它与编写代码没有任何关系.只是一个jitter知道的辅助函数,它将对这个辅助函数的调用直接编译到生成的机器代码中.JIT_Newarr1()将是您遇到的另一个,它会分配一个数组.

我不知道PerfView,请注意JIT_New()的执行时间可能包括执行垃圾收集所需的时间.当JIT_New()运行时,当#0堆已满时会发生这种情况.这可以解释大百分比,JIT_New()在其他方面非常快.您无能为力,这在任何托管程序中都是固定的开销.

  • 如果你假设`JIT_New()`包含垃圾收集所花费的时间是正确的(我相信它是),那么"你无能为力"并不完全正确:在许多情况下,它值得运行在一个好的[内存分析器](http://stackoverflow.com/questions/399847/net-memory-profiling-tools)下的程序,并弄清楚如何创建更少的对象(即更少的垃圾).高"GC中的%时间"性能计数器可以表示编写得不好的程序. (2认同)