Wie hoch ist der Leistungsaufwand bei der Verwendung von Ereignissen?

7

Ich bin ziemlich neu in der Programmierung und habe mit meinen begrenzten Kenntnissen von OOP entschieden, Ereignisse zu verwenden, um zwischen meinen Klassen zu kommunizieren. Natürlich wird dies zu einigen Ereignissen führen.

Ich wollte wissen, ob es einen zusätzlichen Aufwand für die Verwendung von Ereignissen gibt. Ich würde annehmen, dass, wenn nicht auf ein Ereignis reagiert wird (d. H. Es gibt einen Listener in einer Klasse, die eine Funktion ausführt, basierend auf dem Ereignis, das ausgelöst wird), dann sollte dies nicht wirklich eine große Auswirkung haben. Aber ich bin mit den Ereignissen in C # nicht vertraut und wollte nur bestätigen, ob es einen erheblichen Mehraufwand für das Abfeuern eines Ereignisses gibt?

    
Garry Wong 17.12.2013, 21:27
quelle

4 Antworten

11
  

Ich wollte wissen, ob es einen zusätzlichen Aufwand für die Verwendung von Ereignissen gibt. Ich würde annehmen, dass, wenn nicht auf ein Ereignis reagiert wird (d. H. Es gibt einen Listener in einer Klasse, die eine Funktion ausführt, basierend auf dem Ereignis, das ausgelöst wird), dann sollte dies nicht wirklich eine große Auswirkung haben. B

Im Allgemeinen ist dies wahr. Das Standardmuster zum Auslösen eines Ereignisses sieht nichts anderes vor, als die Aufrufliste zu überprüfen, ob Abonnenten vorhanden sind, und zurückzukehren, wenn keine Zuhörer vorhanden sind, was in den meisten Fällen sehr gering in Bezug auf die Leistung ist und wahrscheinlich auch nicht sein wird ein Problem.

Selbst wenn Abonnenten vorhanden sind, ist der Overhead bei der Verwendung von Ereignissen noch relativ gering, da sie die Subskriptionshandler tatsächlich durch einen Delegataufruf aufrufen, der immer noch relativ schnell ist (obwohl langsamer als ein direkter Methodenaufruf). Solange Sie dies nicht in sehr engen Schleifen tun, ist es wahrscheinlich unbedeutend.

Das heißt, wie bei jeder Performance-Frage, läuft es auf Messung hinaus. Ohne tatsächlich zu messen, gibt es keine Möglichkeit zu wissen, wie wichtig die tatsächliche Nutzung in der Praxis ist. Um sicher zu wissen, ob dies in Ihrem speziellen Fall eine vernünftige Design-Entscheidung ist, müssen Sie die Verwendung der Ereignisse profilieren, um sicherzustellen, dass es sich nicht um ein bedeutendes Problem handelt.

    
Reed Copsey 17.12.2013, 21:32
quelle
8
  

Gibt es zusätzlichen Aufwand für die Verwendung von Ereignissen?

Nun, ja - Sie haben ein MulitcastDelegate beteiligt, Code überprüft, um festzustellen, ob ein Event-Handler tatsächlich angehängt ist, etc ..

  

Gibt es signifikanten zusätzlichen Overhead einfach zum Abfeuern eines Ereignisses?

Ahh - die wirkliche Frage. Es gibt Overhead, aber ist es signifikant ? Dies kann nur durch Messung beantwortet werden.

Ich schätze, dass der Overhead, den Sie erfahren, nicht signifikant ist (sonst würde es Warnungen geben, Ereignisse in performancekritischen Anwendungen zu verwenden, die ich nicht gesehen habe) und dass es andere Teile gibt zu Ihrer Anwendung, die eine größere Auswirkung auf die Leistung haben.

    
D Stanley 17.12.2013 21:32
quelle
2

Ich bin mir nicht sicher, ob jemand den Overhead quantifiziert hat, aber er ist wahrscheinlich für die meisten Zwecke ziemlich klein. Wenn Sie neu in der Programmierung sind, dann werden Sie wahrscheinlich nicht zuerst Ultra-High-Performance-Code schreiben (und wenn Sie es wären, würden Sie wahrscheinlich nicht C # verwenden, oder?)

Eine Sache, vor der Sie sich hüten sollten, ist der Umfang eines veröffentlichten Ereignisses. Sie können in einer Situation enden, in der Dutzende von Abonnenten für ein bestimmtes Ereignis vorhanden sind, aber tatsächlich kümmern sich nur ein oder zwei wirklich um eine bestimmte Instanz des Ereignisses. Dieser kann zu einem erheblichen Overhead führen. In diesem Zusammenhang könnte es sich lohnen, das Paradigma der reaktiven Programmierung in System.Observable zu betrachten. Dies kann dazu beitragen, das Übersenden zu begrenzen, indem Sie nur Handler für die Abonnenten aufrufen können, die sich tatsächlich um ein bestimmtes Ereignis kümmern.

    
McGarnagle 17.12.2013 21:36
quelle
-1

Ja, da ist Overhead. Ja ist kann signifikant sein. Dies ist auch nicht schwer zu beweisen. Ein Ereignis ist ein Multicast-Delegat, delegiert wie eine Methode den Block bis zum Ende.

Dies sind tatsächliche Zeitpunkte, die die beiden vergleichen, um die gleiche Menge an Arbeit zu erledigen: Ereignisse verwenden Zeit bis zum Abschluss 271271.687 Millisekunden = 271.271687 Sekunden

Keine Verwendung von Ereignissen Zeit bis zum Abschluss 123214.514 Millisekunden = 123.214514 Sekunden

Verwenden Sie Ereignisse, bei denen Ereignisse am besten passen.

    
JeffBramlett 26.03.2018 13:37
quelle

Tags und Links