Performance von SELECT und IF

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@PBprogger
> :lol: :lol: :lol:
Lach mich nicht aus! :lol:
Kleiner Scherz
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Ich lach nicht über dich sondern mit dir :mrgreen: !


\\Edit:

Das "kleiner Scherz" hab ich übersehen <) .
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

Hallo zusammen,

ich bin bei der Optimierung eines Programmes und stelle mir die Frage was wohl grundsätzlich schneller ist:

Eine Select-Abfrage oder eine If-Abfrage. Persönlich verwende ich gerne wegen der Übersicht Select.

Gibts da Erfahrungen oder gar echte Fakten?
Hallo!

Grundsätzlich hängt es von der Komplexität deiner Abfragen ab. In der Regel ist Select bei multiple Queries schneller ( da ja auch keine expressions evaluiert werden müssen ). Genauso ist ein If x=0 keine gute Testbasis für sowas. Wenn du wirklich x als nullwert überprüfen willst kannst du das ganze revertiert prüfen anstatt zu checken ob im speicherbereich unter x ne null steht ...

Ansonten für IF's gilt noch - wenns nur drum geht eine Variable zu überprüfen welche nicht 0 sein sollte ist IF x schneller als if x = 1 zb.
Wenns wirklich zeitkritisch und um viele Optionen geht lohnt sich manchmal noch das ganze mit einem Select / If Konstrukt zu verschachteln ( dadurch verhinderst du das jedesmalige ausrechnen der Expressionen ( öh ... heisst das so in Deutsch ? ) .

Thalius
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Bei mir kam volgendes bei raus

Mit Debuger und CnQ an
IF: 1110ms
SELECT: 1469ms

Ohne Dbuger und CnQ an
IF: 63ms
SELECT: 109ms

Mit Debuger und CnQ aus
IF: 875ms
SELECT: 1234ms

Ohne Dbuger und CnQ aus
IF: 15ms
SELECT: 31ms

Allerdings schwanken die werte ohne Debuger bis zu 30-40% jenachdem wie viel last die CPU gerade bewältigen muß.

CPU hab ich nur ne AMD Athlon 64 3700+ läuft durch CnQ aufm Desktop nur auf 1Ghz und unter vollast auf 2,2Ghz daher hab ich beides mit angegeben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wie Thalius bereits sagte, besitzt dieser test so gut wie keine aussagekraft,
weil das testobjekt ungünstig gewählt ist.

da ist so ein konstrukt schon besser geeignet:

Code: Alles auswählen

Dim test.l(99)
For n=0 To 99
  test(n) = Random(4)
Next

count = 0
timer1 = ElapsedMilliseconds()
For t = 0 To 999999
  For n = 0 To 99
    tester = test(n)
    Select tester
      Case 0
        count + 1
      Case 1
        count + 1
      Case 2
        count + 1
      Case 3
        count + 1
      Case 4
        count + 1
    EndSelect
  Next
Next
timer1 = ElapsedMilliseconds()-timer1

count = 0
timer2 = ElapsedMilliseconds()
For t = 0 To 999999
  For n = 0 To 99
    tester = test(n)
    If tester = 0
        count + 1
    EndIf
    If tester = 1
        count + 1
    EndIf
    If tester = 2
        count + 1
    EndIf
    If tester = 3
        count + 1
    EndIf
    If tester = 4
        count + 1
    EndIf
  Next
Next
timer2 = ElapsedMilliseconds()-timer2

MessageRequester("SpeedTest","Select: "+Str(timer1)+#CRLF$+"If: "+Str(timer2))
auf jeden fall ohne debugger laufen lassen.
dann sieht man auch, dass der unterschied nur marginal ist, select ist nur minimal schneller,
also kann das mit "grundsätzlich weniger evaluationen" nicht ganz zutreffen.
das ist dann wohl eher der fall, wenn man ne komplexe berechnung testen will,
aber so etwas sollte man eh im voraus berechnen und in eine zwischenvariable packen.
das hab ich hier übrigens auch gemacht, damit wirklich der unterschied zwischen If und Select getestet wird,
und keines sagen kann, das liegt am 5-fachen zugriff auf das Array.


ich hab keinen Plan, was CnQ is, is auch egal.
wenn man's eigentlich eh immer an hat, kann mans auch bei speedtest anlassen,
es geht ja eh nur um den vergleich.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

ich hab keinen Plan, was CnQ is, is auch egal.
Kennste nicht Cool'n'Quit? <)
Regelt die leistung der CPU je nach bedarf so bleibt sie kühler und verbraucht nicht ganz so viel strom, der lüfter dreht im algemeinen
langsamer wodurchs auch leiser wird.
Ist auf jedenfall ganz praktisch.

Bei deinem beispiel bekam ich volgendes ergebnis
IF: 1797ms
SELECT: 2250ms

Aber egal wie oft ich es getestet hab Select war nie schneller ^_^
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

tja, bei mir war's schneller... hast du denn ohne debugger getestet?

PS:
ok.. kommt auch vor, dass If schneller ist:
Select: 1844
If: 1937

Select: 1844
If: 1904

Select: 1875
If: 1812

Select: 1844
If: 1890

Select: 1860
If: 1890

Select: 1860
If: 1812
aber wie gesagt, der unterschied ist marginal, also vernachlässigbar.
kommt wirklich extrem auf die verwendung und aufs konstrukt drauf an, was man wählt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Damit ist alles geschrieben . Thread ZU bevor hier noch Schlimmeres
passiert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Gesperrt