Seite 1 von 1

Select/Endselect schneller oder langsamer als If ?

Verfasst: 19.11.2024 12:03
von EmmJott
Servus allerseits,

bastle an einem Progrämmchen rum, das aus einem Panelgadget mit aktuell 4, später vielleicht auch noch mehr Panels bestehen wird. Jedes Panel zeigt ein Listicongadget an, je nach Auswahl im Gadget werden die Inhalte der ListIconGadgets der anderen Panels angepasst.

Größenänderungen des Fensters werden per BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), 0) abgearbeitet. Dabei war die Überlegung, jeweils nur den Inhalt des angezeigten Panels per Resizegadget anzupassen, bei den nicht sichtbaren Gagdets wollte ich die Rechenarbeit sparen und erst beim Anzeigen eines anderen Panels ein "Fensterupdate" machen lassen.

Jetzt die Frage an Eure Erfahrungswerte: Welche Vorgehensweise arbeitet am schnellsten?

Code: Alles auswählen

Procedure UpdateWindow()
  GetWinMetrics()
  ResizeGadget(#parentpanel, 10, 8, winw-20, winh-15)
  Select GetGadgetState(#parentpanel)
  case 0
  
  case 1
  
  und so weiter    
oder

Code: Alles auswählen

Procedure UpdateWindow()
  GetWinMetrics()
  ResizeGadget(#parentpanel, 10, 8, winw-20, winh-15)  
  If GetGadgetState(#parentpanel) = 0
  
  endif
  
  If GetGadgetState(#parentpanel) = 1
  
  endif
    
  und so weiter    
oder

Code: Alles auswählen

Procedure UpdateWindow()
  GetWinMetrics()
  ResizeGadget(#parentpanel, 10, 8, winw-20, winh-15)  
  If GetGadgetState(#parentpanel) = 0
  
  elseif GetGadgetState(#parentpanel) = 1
  
  elseif GetGadgetState(#parentpanel) = 2
  
  endif
    
  und so weiter    
Könnte natürlich sein, dass Unterschiede so gering sind und daher vernachlässigt werden könnten ...

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 19.11.2024 12:20
von NicTheQuick
Wenn du jedes Mal erneut `GetGadgetState()` aufrufst, dann ist das natürlich langsamer. Bei dem `Select` rufst du es nur einmal auf.
Wenn du den Wert vorher in eine Variable speicherst und dann `If` statt `Select` benutzt, solltest du keinen messbaren Unterschied bemerken, vor allem nicht in dem Kontext, in dem du dich bewegst, also beim Eventhandling.
Letztendlich ist ein `Select` auch nur ein `If` im Hintergrund, bloß etwas optimierter, und ob es einen Geschwindigkeitsunterschied gibt oder nicht, hängt dann von deiner Umgebung ab. Branch Prediction und Caches in der CPU werden vermutlich dazu führen, dass beides so gut wie gleich schnell ist.

Alternativ kannst du eine Lookup-Table mit Funktionszeigern bauen, sodass der Wert von `GetGadgetState()` der Index zu einem Array ist, das die Funktionszeiger zu den entsprechenden Resize-Operationen für die Gadgets enthält. Damit würde es immer gleich lang dauern, egal welches Panel gerade resized werden soll. Aber es bringt auch mehr Komplexität und ist es am Ende in so einem kleinen Rahmen wahrscheinlich auch nicht wert.

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 19.11.2024 15:51
von Axolotl
Ich würde mir derartige Gedanken erst bei wirklichen Performance Problemen machen. Aus meiner Sicht ist es wichtiger, dass der geschriebene Code verständlich und nachvollziehbar ist.
Ansonsten kannste dir den Code auch vom Compiler in Assember ausgeben lassen und dann die Varianten vergleichen. Ausführungs- und Zykluszeiten berechnen und voila schon weißt Du Bescheid.
Dabei kann die evtuell auch das kleine Projekt hier helfen:
PB-IDE-Tool: Display ASM/C Code (Win,Lin,Mac)

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 19.11.2024 17:28
von NicTheQuick
Seitdem Purebasic das C-Backend hat, würde ich mir den Assembler-Output gar nicht mehr anschauen, sondern einfach das C-Backend nutzen. Der Compiler hat so viele automatische Optimierungen, dass es am Ende egal sein wird, ob du `Select` oder `If` oder irgendwas dazwischen verwendest.

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 19.11.2024 17:52
von STARGÅTE
Ein wichtiger Punkt (zumindest wenn es wirklich die Ausführungsgeschwindigkeit geht) ist, dass man sowohl beim Select-Case- als auch beim If-ElseIf- Konstrukt darauf achtet, dass Fälle, die (möglicherweise) durch die Benutzung des Programms häufiger auftreten, zuerst abfragt. So wird das Konstrukt möglichst früh wieder verlassen und seltenere Fälle gar nicht erst überprüft.
Diese Art der Optimierung kann nämlich auch ein Optimierungsschritt des Compilers nicht durchführen (außer vllt mit einer Lock-Up-Tabelle).

Generell sind diese ganzen Zeiten aber vernachlässigbar (auch im nicht-optimierten Fall).
Sowas wird nur relevant, wenn diese Abfragen sehr sehr häufig ausgeführt werden, z.B. in Schleifen etc.

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 20.11.2024 12:25
von dige
Weil es hier gerade auch um die Verwendung des C-Backends ging: gibt es das auch für 64Bit?

Ich kann bei mir nur zwischen Purebasic 6.12 LTS (Windows x64) und Purebasic 6.12 LTS - C Backend (Windows x86) wählen.

Ich brauche aber unbedingt x64...

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 20.11.2024 13:03
von HeX0R
Natürlich!
Du musst ihn aber natürlich erst einbinden.
Preferences -> Compiler -> Additional Compilers

Re: Select/Endselect schneller oder langsamer als If ?

Verfasst: 20.11.2024 14:54
von dige
Ah 🙈 ..da wäre ich nie drauf gekommen. Danke, es funktioniert! 😀