Eventhandler möglichst performant schreiben
-
Hey,
im Zuge einer AG in meiner Schule beschäftigen wir uns gerade mit dem Projekt eine eigene ComponentLibrary zu schreiben. Ich habe dazu direkt eine Frage, weil ich zu wenig Erfahrung im Programmieren habe um DIE performanteste Möglichkeit für das verarbeiten der Messages von der WndProc Funktion zu finden.
Wir haben es derzeit so, dass wir für jedes Event eines Fensters einen eigenen Funktionspointer haben z.B.
void (*OnCreate)(); void void (*OnClose)(bool&);Die Messages werden derzeit in der Richtung verarbeitet:
//Funktionsauschnitt aus der Funktion, die die Messages verarbeitet switch(message) { case WM_CREATE: { if (OnCreate != NULL) OnCreate(); } }NAtürlich sind das nur Ausschnitte, die ich auch nur schnell aus dem Kopf geschrieben hab. Ich habe das Gefühl, dass das mit den Case Anweisungen sehr langsam wird, vor allem, da wir bereits ca. 25 Messages in alleine einem Fenster haben, wenn dann noch Buttons usw dazukommen könnte ich mir vorstellen, dass das langsam wird. Habt ihr da eventuell Verbesserungsvorschläge oder bessere Möglichkeiten?
Danke!
-
Frolo schrieb:
Ich habe das Gefühl, dass das mit den Case Anweisungen sehr langsam wird, vor allem, da wir bereits ca. 25 Messages in alleine einem Fenster haben, wenn dann noch Buttons usw dazukommen könnte ich mir vorstellen, dass das langsam wird.
Versuchs mal statt mit Fühlen, Vorstellen und vorzeitigem Optimieren mit einem Profiler. Damit kannst du genau gucken, ob das überhaupt ein performance bottleneck ist. Wenn es gar keins ist, musst du dir erst gar keine Gedanken über eine eventuelle Optimierung machen und den code einfach so schreiben, wie er am leserlichsten ist.
-
Die Funktionspointer sind viel langsamer als das switch. Abgesehen davon bezweifle ich, dass euch die 3 Nanosekunden euer Projekt kaputt machen werden.
Konzentriert euch darauf guten Code zu schreiben, der Compiler wirds schon richten. Sollte das Programm am Ende doch zu langsam sein musst du einen Profiler benutzen um den Grund zu finden und erst dann solltest du dich um performanten Code kümmern.
-
Frolo schrieb:
//Funktionsauschnitt aus der Funktion, die die Messages verarbeitet switch(message) { case WM_CREATE: { if (OnCreate != NULL) OnCreate(); } }In der Annahme, daß die Messages nicht lückenlos durchlaufende Zahlenwerte haben, ist das switch lahm. Ok, man müßte es nur einmal in der großen WinMain haben, könnte die Zahlenwerte umsetzen in eigene, die lückenlos sind und bei weiterer Verarbeitung wäre es billig.
Das if würde ich mir schenken und einfach gegebenenfalls eine leere Handler-Funktion hinterlegen.
Also würde ich versuchen, ob virtuelle Methoden und Vererbung passen.