このildasmは、関数の直接呼び出しが「call method」コマンドで実行され、イベントを介した呼び出しが「callvirt delegatename::Invoke()」で実行されることを示しています。直接呼び出しの方が速いと思われるかもしれませんが、Invoke() とは何かを考えてみましょう。Invoke は、Delegate または MulticastDelegate クラスのメンバーではありません。コンパイラによって生成される特別なメソッドです
.method public hidebysig virtual instance void
Invoke(string s) runtime managed
{
}
このメソッドには実装が含まれていないため、奇妙に見えるかもしれません。しかし、「実行時」指定子に注意を払うと、魔法は消えてしまいます。「ランタイム」とは、実行時にコードが生成されることを意味し、ご存知のように、それは一度だけ発生します。したがって、理論的には、どちらも生産性の点で同じでなければなりません。
Jon Skeet のテストに関しては、私はそれを数回起動し、デリゲートの助けを借りて直接呼び出しと呼び出しを交換しましたが、デリゲートがパフォーマンスを向上させるという確認は得られませんでした。代議員が勝つこともあれば、直接電話が勝つこともありました。GC か .NET 内の何かがテストに影響を与えているか、Windows によってプロセスが切り替えられているためだと思います。