9

Visual Studioでプロファイラーを使用して高価な関数を追跡していると、ほとんどの作業が[clr.dll]で行われることがあります。それは基本的にブラックボックスに相当し、なぜそこに多くの時間を費やしているのかを追跡する方法があるのだろうかと思います。

clr.dllは、JITのコンパイル、アセンブリの読み込み、アプリドメインの管理、ガベージコレクション、リフレクションなどを処理すると思います。しかし、どのコードが多くの時間を費やしているのかを実際に判断するのは非常に困難です。

明らかに、ランタイム自体以外のコードがclr.dllで多くの時間を費やしているので、どのコードに問題があるのか​​をどのように追跡しますか?

4

2 に答える 2

1

コードのどの部分(編集およびコンパイルできるコード、修正できる唯一のコード)を知る必要があります。そのコードのどの部分が、使用時間のかなりの割合を占めています。

コードのどの部分が原因であるかがわからない限り、clr.dllが多くの時間を使用していることを知るのはよくありません。

その情報はコールスタックにあります。

20%などの数パーセントの時間スタック上にあるメソッドまたは1行のコードがある場合、それはおよそそのパーセントの時間の原因になります。どういうわけかそのコード行を削除する(または時間を大幅に短縮する)ことができれば、合計時間の20%がゼ​​ロになるか、ほぼゼロになり、1.0 / 0.8 = 1.25または25%のスピードアップ係数が得られます。

では、どのようにしてそのような線を見つけますか? これが私が使っている方法です。 全体的な結果が評価されない限り、誰もそれがきれいだと主張しません。繰り返し適用すると、大きなスピードアップ要因が発生する可能性があります

于 2012-06-30T17:49:55.597 に答える
1

私の経験に基づくと、それはおそらくGCにあります。LINQを使用する場合、ほぼ確実にGCに含まれています。Gen0スパムを追跡するためにCLRProfilerをお勧めします。

于 2013-09-13T18:32:08.350 に答える