2012-12-13 10 views
6

私は私の質問を明確にしようとするでしょう:C#で関数呼び出しとイベントの間にパフォーマンスの違いはありますか?

私は、(これは誰か(XNA)は毎秒彼女の60回を呼び出す)関数はドローと呼ばれてい と私は描画する多くのオブジェクトを持っているので、私は次のコードを持っています: void Draw() { obj1.draw(); obj2.draw(); obj3.draw(); .... }

代わりに、私はDraw()によって生成されるイベントを作成し、すべてのオブジェクトがイベントにサインアップする場合、パフォーマンスに影響はありますか?

私が尋ねていることを明確にしない場合: イベントにサインインして関数を呼び出すのが通常の呼び出しと異なるのですか?

+2

パフォーマンスにはコメントできませんが、イベントドリブンシステムに切り替えるとコードの保守性が大幅に向上し、確かに優れた設計と言えます。 –

+0

また、イベントハンドラは通常、独自のスレッドで実行されます。関数呼び出しは同じスレッドで実行されます。あなたはUI操作を伴うと思われる描画について話しているので、これに注意する必要があります。 – ryadavilli

+2

@ryadavilli私は特定のイベントハンドラが正常に起動すると、自分のスレッドで起動しないことを確認しています。イベントハンドラは、現在のスレッドで順次実行されます。 – Maarten

答えて

6

パフォーマンスに関して、私はJon Skeet's exampleがデリゲートがパフォーマンスに重大なオーバーヘッドを加えず、改善する可能性があることを確信しています。

イベント/デリゲートで考慮する必要がある要因の1つは、イベントをリッスンしているオブジェクトを処理しているか、参照カウントが正しくリセットされず、メモリリークが発生します。

4

ildasmは、 "call method"コマンドで関数の直接呼び出しが実行されていることを示しています。 "callvirt delegatename :: Invoke()"。直接呼び出しが高速になるはずですが、Invoke()とは何かを考えてみましょう。 Invokeは、DelegateクラスまたはMulticastDelegateクラスのメンバーではありません。これはコンパイラによって生成される特別なメソッドです

.method public hidebysig virtual instance void 
      Invoke(string s) runtime managed 
{ 
} 

このメソッドには実装が含まれておらず、奇妙に見えます。しかし、 "実行時"の指定子に注意を払うと、魔法が消えてしまいます。 「実行時」とは、実行時にコードが生成されることを意味します。わかっているように、コードは1回だけ発生します。だから、理論的には両方とも生産性の面で同じでなければならない。

Jon Skeetのテストに関しては、私は数回起動し、代理人の助けを借りて直接電話をかけ、代理人がパフォーマンスを向上させることを確認しませんでした。時には代議員が勝った、時には直接コールウォン。私はそれがGCや.NETの中にある何かがテストに影響を与えるか、Windowsでプロセスを切り替えるだけだと思う​​。

関連する問題