実行されたIL命令の数をカウントする方法はありますか?
-
03-07-2019 - |
質問
C#プロセスのベンチマークを行いたいが、ベクトルとして時間を使いたくない-特定のメソッド呼び出しで実行されるIL命令の数をカウントしたい。これは可能ですか?
編集メソッド本体の静的分析を意味するものではありません-実際に実行される命令の数を指しています-たとえば、メソッド本体にループが含まれている場合、ループを構成する多くの命令*ループが繰り返される回数によってカウントが増加します。
解決
あなたがやりたいことをすることは不可能だと思います。これは、ILがJIT(Just-In-Time)コンパイル中にのみ使用されるためです。メソッドが実行されるまでに、ILはネイティブマシンコードに変換されています。そのため、特定のメソッド/タイプ/アセンブリ内のIL命令の数を静的にカウントすることは可能かもしれませんが、実行時にこれの概念はありません。
解釈されるIL命令の数を知る意図を述べていません。メソッド本体のILカウントとマシンコード命令の実際の数との間に緩やかな相関関係しかないことを考えると、この数を知ることで何が達成されるかわかりません(好奇心を満たす以外)。
他のヒント
まあ、それは簡単ではありません。 ILのブロックの後に実行されるパフォーマンスカウンターコードを使用して、コンパイル後にアセンブリをインストルメントできると思います 。たとえば、intをスタックにロードするメソッドのセクションがあり、最適化されたコードの下でそのintを使用して静的メソッドを実行した場合、intのロードと呼び出しに対してカウント2を記録できます。
既存のIL /マネージアセンブリの読み取り/書き込みプロジェクトを使用したとしても、これはかなり困難なタスクです。
もちろん、x86 / ia64 / x64へのジャストインタイムコンパイル中にカウンターが記録した一部の命令は最適化されなくなる可能性がありますが、それは抽象的な言語に基づいてプロファイリングしようとするリスクがありますILのように。
ICorDebug を使用できます。管理インターフェース。メソッドの先頭でブレークポイントをチャックし、プログラムからメソッドを抜けるまでコードをステップ実行します。
しかし、メトリックがどれほど役立つかはわかりません。人々はこの種のものに時間を使う傾向があります。一部のIL命令は他の命令よりも高価です。
Code Metrics アドインを使用しますリフレクターへ
CodeMetricsアドイン分析と いくつかのコード品質メトリックを計算します アセンブリに。このアドインは 従来のメトリックを計算するリフレクター 循環的複雑度など などの簡単なもの メソッド内のローカル変数の数。 すべての結果はファイルに保存できます。
プラグインをインストールします。アセンブリを選択し、メソッドメトリックを読み込みます。 CodeSize、CyclomaticComplexity、#of Instructionなどのグリッドが表示されます。
静的カウントは必要ないことはわかっています。ただし、アークごとの静的ILカウント、およびアークが一緒に実行された回数に加えて、ILカウントが得られます。このために各アークを計測する必要があります。これにはカウンターの挿入が必要です。
(アークとは、ジャンプインまたはアウトできない一連の命令です。最初の命令を実行すると、常に最後の命令などが実行されます。)