Zeitmessung

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hallo,
    meine Software besteht aus 2 Backgroundworkern und einem Thread. Backgroundworker bgw_receive empfängt die Startbedingung der Zeitmessung und versendet auch die Endbedingung der Zeitmessung. Wie messe ich diese Zeitdifferenz am besten? Benötige ich hierzu einen extra Thread?

    Gruß

    Max
    Genau dafür gibt es die Klasse StopWatch.
    Da das nix mit GUI zu tun hat, brauchst Du auch nix zu invoken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    wobei ich mich gelegentlich frage, wozu die Stopwatchklasse da ist.
    Wie Dodo schreibt: Eine simple Variable vom Typ DateTime leistet ungefähr dasselbe wie eine Stopwatch-Instanz.
    Bleibt nur anzunehmen, dass Stopwatch im Hintergrund eine genauere Zeit-Feststellung hat, oder sich iwie ganz toll kalibriert oder was.
    Aber für so tausendstel Sekunden-Genauigkeit reicht glaub wirklcih eine dumme DateTime-Variable (müssteman mal testen, ob und um wieviel genauer Stopwatch ist).
    Der einzige Vorteil der StopWatch-Klasse, der mir einfällt ist, dass es keine Probleme gibt, wenn der User während der Messung des Zeitintervalls die Systemzeit ändert oder allgemein, dass die Abweichungen, die bei der Systemzeit auftreten vermieden werden. Damit ist die StopWatch wohl etwas genauer. (Die Systemuhr "verschiebt" sich ja ohne Synchronisierung durch einen Zeitserver relativ schnell.)

    ErfinderDesRades schrieb:

    Bleibt nur anzunehmen

    Die Stopwatch verwendet den HPET, wenn vorhanden (.IsHighResolution=True). Das ist Hardware und OS abhängig. Die anderen Zeitfunktionen verwenden den normalen System-Timer mit einer geringeren Auflösung.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim d0 As DateTime, d1 As DateTime
    3. Dim stp = Stopwatch.StartNew
    4. d0 = DateTime.Now
    5. Threading.Thread.SpinWait(1024 * 1024)
    6. d1 = DateTime.Now
    7. stp.Stop()
    8. d0 = DateTime.Now
    9. Threading.Thread.SpinWait(1024 * 1024)
    10. d1 = DateTime.Now
    11. Dim diff = d1 - d0
    12. Debug.Print("Stopwatch = {0}, DateTime = {1} ", stp.ElapsedTicks / 10000.0#, diff.TotalMilliseconds)
    13. End Sub


    output:

    Quellcode

    1. Stopwatch = 1.8743, DateTime = 5.0021
    2. Stopwatch = 1.6935, DateTime = 5.0021
    3. Stopwatch = 2.0414, DateTime = 6.0022
    4. Stopwatch = 1.6932, DateTime = 5.0021
    5. Stopwatch = 1.7067, DateTime = 5.0021


    Dh der erste Teil mit der Stopwatch (der auch DateTime Objekte zuweist, um diese Zeit rauszurechnen) ist bei solchen kurzen Zeitmessungen deutlich besser.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()

    also mit

    VB.NET-Quellcode

    1. Dim stp = Stopwatch.StartNew
    2. Dim d0 = DateTime.Now
    3. Threading.Thread.SpinWait(1024 * 1024)
    4. Debug.Print("Stopwatch = {0}, DateTime = {1} ", stp.ElapsedMilliseconds, (DateTime.Now - d0).TotalMilliseconds)
    stelle ich gelegentliche Abweichungen von 1 Millisekunde fest.

    Ausgabe schrieb:

    Stopwatch = 18, DateTime = 19
    Stopwatch = 16, DateTime = 16
    Stopwatch = 16, DateTime = 16
    Stopwatch = 16, DateTime = 16
    Stopwatch = 16, DateTime = 16
    Stopwatch = 16, DateTime = 17
    Stopwatch = 16, DateTime = 17
    Stopwatch = 16, DateTime = 17
    Stopwatch = 16, DateTime = 16


    Deiner Rechnung

    VB.NET-Quellcode

    1. stp.ElapsedTicks / 10000.0#
    trau ich nicht so recht übern Weg, ob das wirklich Millisekunden aussagt.

    Messungen im sehr kurzen Bereich sind mir eh suspekt - ich weiß ja nicht, ob andere Prozesse das Ergebnis verfälschen, indem sie Leistung abziehen, oder ob ieine Form von Cashing greift.