• @WinXP 32bit 1Ghz P3
    Für folgenden Code

    Code
    $i = 0
    $beginn = TimerInit()
    While $i < 1000
     $i += 1
    WEnd
     
     MsgBox(0, '', TimerDiff($beginn))


    braucht die While Wend bzw. die for next - Schleife zwischen 2,x und 53,x ms; ~ 35ms.
    Und die Do- Until Schleife zwischen 0,06 und 0,08 ~ 0,7 ms. Das heißt mindestens 2,5 (250%) mal bis zu 900 mal (90000 %) effektiver :!:
    Und ich dachte der Unterschied ist gegen 0 *lach*
    ___________________________________________________________________________________
    Switch Case gg Select Case


    Switch braucht etwa rund 0,1 ms. Es spielt keine Rolle, ob das Case 0 oder Case 5 ist.
    Select Case $i = 0 braucht bei Case 0 im Schnitt ca. 5%-10% länger als Switch, kann auch mal knapp schneller sein (selten). Select Case $i = 5 braucht dagegen immerhin schon 20% - 25% mehr Zeit. Hier also die wahrscheinlichsten Bedingungen am Anfang setzen.
    Bin gespannt über eure Comments :D

  • Der Unterschied geht auch tatsächlich gegen null.
    Dein Messverfahren ist lediglich ungenügend.
    Die einzelnen Durchläufe sind stark variant so das eine einzelne Zeitmessung nicht repräsentativ ist.
    Man muss schon mehrere Durchläufe machen und einen Mittelwert bilden um ein erstmal halbwegs vernünftiges Ergebnis zu erhalten.
    Später sollte man dann auch noch die Varianzen mit messen um eine Aussage über die erreichte Genauigkeit abzuschätzen.
    Aber im einfachsten Fall würde das so aussehen:

    Spoiler anzeigen
    [autoit]

    Global Const $iN = 10000

    [/autoit] [autoit][/autoit] [autoit]

    $Time = TimerInit()
    For $t = 1 To $iN
    $i = 0
    While $i < 1000
    $i += 1
    WEnd
    Next
    $Time = TimerDiff($Time) / $iN

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(StringFormat("Durchschnittliche Dauer While: %.5f ms", $Time) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $Time = TimerInit()
    For $t = 1 To $iN
    $i = 0
    Do
    $i += 1
    Until $i = 1000
    Next
    $Time = TimerDiff($Time) / $iN
    ConsoleWrite(StringFormat("Durchschnittliche Dauer Do-Until: %.5f ms", $Time) & @CRLF)

    [/autoit]
    • Offizieller Beitrag

    mille86, hast vllt. vergessen bei der Do-Until-Schleife die Abbruchbedingung anzupassen. Ausserdem ist auch noch abhängig von den Prozessen die sonst noch auf dem Rechner laufen.

  • Ich war tatsächlich zu bequem, um mir so eine Schleife zu proggen.
    Aber ich habe de Scripts jeweils ein dutzend mal getestet und bin dann zum obigen Ergebnis gekommen. Dabei blieb es immr in dieser Spannweite. Die Prozesse im Hintergrund erkläre ja die unterschiedlichen Zeiten. Nur blöd, dass ich die langsame 200Mhz Maschine verkauft habe, sonst würde es genauer sein.
    @ Bernd70: Nee, die war schon wirklich dabi.

  • Zitat

    Ausserdem ist auch noch abhängig von den Prozessen die sonst noch auf dem Rechner laufen.

    Ja, und diesen Faktor kann man selten aus einem "Benchmark" draussen halten.
    Also ich "benchmarke" am liebsten auf einer Maschine, auf der gleichzeitig viele Platten- und Netzwerkzugriffe und höchste Prozessorlast stattfinden. Schlimmer kanns nicht kommen, wenn das Script in dieser Umgebung problemlos durchläuft, dann ist sehr unwahrscheinlich, daß bei einem unbelasteten Rechner das Script Probleme macht.
    Daher habe ich auch noch eine sehr alte Kiste hier stehen, um speziell Install-Scripte zu testen.

  • Du solltest auf jeden Fall immer mehrere Durchläufe machen um genauere Ergebnisse zu erhalten.
    Du solltest auch ein Sleep(0) vor dem TimerInit machen um eine frische Zeitscheibe zu bekommen.

    [autoit]

    Sleep(0)
    $beginn = TimerInit()

    [/autoit]


    Andy: Das mit der Volllast ist für Stabilitätstest aber nicht für Benchmarks geeignet.

    Wieso eigendlich einen Benchmark auf einem exta altem Rechner durchführen?
    Das verfälscht die Ergebnisse noch vollständig, da ein moderner Prozessor Hardwareuntestützung für bestimmte Befehle mitbringen die ein alter noch nicht hatte.

    MFG. RAPTOR-ONE

  • Könntest du mir das mit der "Zeitscheibe" bitte nochmal genauer erklären.
    Hab das jetzt so interpretiert das du damit immer einen neuen Tick erzwingen willst um den systematischen Fehler von TimerInit/TimerDiff zu minimieren.
    Aber wenn ich das mal teste komme ich auf gleiche Werte:

    Spoiler anzeigen
    [autoit]

    Global Const $N = 100000
    Global $Sum = 0

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $N
    $Sum += TimerDiff(TimerInit())
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(StringFormat("TimerDiff systematischer Fehler ohne Sleep(0) Durchschnitt: %.5f ms", $Sum / $N) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $Sum = 0

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $N
    Sleep(0)
    $Sum += TimerDiff(TimerInit())
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(StringFormat("TimerDiff systematischer Fehler mit Sleep(0) Durchschnitt: %.5f ms", $Sum / $N) & @CRLF

    [/autoit]


    Mal abgesehen davon das der systematische Fehler von TimerInit/TimerDiff im Vergleich zu den anderen Messwerten vernachlässigbar klein ist, vor allem weil er bei meinem oben angegebenen Skript nur zu 1/$N eingeht.

    Aber vielleicht meintest du ja auch was anderes mit der "Zeitscheibe".

    Edit: Ach ja ich konnte natürlich Wikipedia entlocken was mit "Zeitscheibe" gemeint ist.
    Meine Frage ist eher welchen Einfluss das auf unsere Messwerte haben sollte.

  • Du solltest auf jeden Fall immer mehrere Durchläufe machen um genauere Ergebnisse zu erhalten.
    Du solltest auch ein Sleep(0) vor dem TimerInit machen um eine frische Zeitscheibe zu bekommen.

    [autoit]

    Sleep(0)
    $beginn = TimerInit()

    [/autoit]


    Andy: Das mit der Volllast ist für Stabilitätstest aber nicht für Benchmarks geeignet.

    Wieso eigendlich einen Benchmark auf einem exta altem Rechner durchführen?
    Das verfälscht die Ergebnisse noch vollständig, da ein moderner Prozessor Hardwareuntestützung für bestimmte Befehle mitbringen die ein alter noch nicht hatte.

    MFG. RAPTOR-ONE

    Die Ergebnisse verhalten sich doch trotzdem propotional. ^^