Select/Endselect schneller oder langsamer als If ?

Anfängerfragen zum Programmieren mit PureBasic.
EmmJott
Beiträge: 46
Registriert: 25.10.2024 12:23

Select/Endselect schneller oder langsamer als If ?

Beitrag 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 ...
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag 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.
Axolotl
Beiträge: 278
Registriert: 31.12.2008 16:34

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag 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)
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag von HeX0R »

Natürlich!
Du musst ihn aber natürlich erst einbinden.
Preferences -> Compiler -> Additional Compilers
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Select/Endselect schneller oder langsamer als If ?

Beitrag von dige »

Ah 🙈 ..da wäre ich nie drauf gekommen. Danke, es funktioniert! 😀
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten