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