Zeitmessen einer Prozedur in Millisekunden (Microsoft.VisualBasic.DateAndTime.Timer)

  • VB.NET

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

    Zeitmessen einer Prozedur in Millisekunden (Microsoft.VisualBasic.DateAndTime.Timer)

    Hallo Leute

    Ich möchte in meinem Programm (Sortierprogramm) die Zeit in Millisekunden messen welche vergangen ist bis der Text sortiert wurde .
    Sprich am Anfang der (Ereignis)prozedur soll die Zeitmessung beginnen und am Ende der Prozedur sollte die Vergangene Zeit berechnet und ausgegeben werden.
    Das ganze funktionierte mit der Zeichensortierung recht gut jedoch bei der Wortsortierung überhaupt nicht, ich erhalte immer nur 0.00000 "Sek".

    Ich versuchte es bis jetzt mit der Timer-Eigenschaft: Microsoft.VisualBasic.DateAndTime.Timer der die Anzahl der seit Mitternacht vergangenen Sekunden angibt und als Double zurückgibt.
    Oder gäbe es evtl. eine Variante bei der es Sicher funktionieren würde ?

    Das ganze sieht so aus:
    (kurz)

    VB.NET-Quellcode

    1. Private Sub cmdSortieren_Click(sender As System.Object, e As System.EventArgs) Handles cmdSortieren.Click
    2. Dim strVerfahren As String = lstSortierverfahren.SelectedItem
    3. Dim strText As String = txtText.Text
    4. Dim SortierString As String = txtText.Text 'Für Quicksort
    5. Dim mdatStartZeit As Double = 0
    6. Dim mdatEndeZeit As Double = 0
    7. Dim dblTotalZeit As Double = 0
    8. lblSortierzeit.Text = ""
    9. mdatStartZeit = Microsoft.VisualBasic.DateAndTime.Timer
    10. 'If ....
    11. 'Select Case ...
    12. 'Aufruf der Sortierverfahren in Modulen
    13. 'If ...
    14. 'Select Case ...
    15. 'Aufruf der Sortierverfahren in Modulen
    16. mdatEndeZeit = Microsoft.VisualBasic.DateAndTime.Timer
    17. dblTotalZeit = mdatEndeZeit - mdatStartZeit
    18. lblSortierzeit.Text = Format(dblTotalZeit, "0.0000000") & " Sek"


    VB.NET-Quellcode

    1. Private Sub cmdSortieren_Click(sender As System.Object, e As System.EventArgs) Handles cmdSortieren.Click
    2. Dim strVerfahren As String = lstSortierverfahren.SelectedItem
    3. 'Prüfen ob: String vorhanden, Sortierverfharen gewählt, Sortierart gewählt.
    4. If txtText.Text = "" Or txtText.Text = " " Then
    5. MsgBox("Bitte zu Sortierenden Text eingeben")
    6. Exit Sub
    7. ElseIf lstSortierverfahren.SelectedItem = "" Then
    8. MsgBox("Bitte Sortierverfahren wählen")
    9. Exit Sub
    10. ElseIf optWorte.Checked = False And optZeichen.Checked = False Then
    11. MsgBox("Bitte Sortierart (Wort, Zeichen) wählen.")
    12. Exit Sub
    13. Else
    14. End If
    15. Dim strText As String = txtText.Text
    16. Dim SortierString As String = txtText.Text 'Für Quicksort
    17. Dim wortArray() As String
    18. 'Zeit
    19. Dim mdatStartZeit As Double = 0
    20. Dim mdatEndeZeit As Double = 0
    21. Dim dblTotalZeit As Double = 0
    22. lblSortierzeit.Text = ""
    23. mdatStartZeit = Microsoft.VisualBasic.DateAndTime.Timer 'startzeit(mdatStartZeit)
    24. If optWorte.Checked = True Then
    25. worteLesen(strText, wortArray)
    26. 'Wortsortierung
    27. Select Case strVerfahren
    28. Case "Bubble Sort"
    29. If chbUmlaute.Checked = False Then
    30. modSortWort.bubbleWortSort(wortArray)
    31. ElseIf chbUmlaute.Checked = True Then
    32. modSortWortUmlaut.bubbleWortSortUmlaut(wortArray)
    33. End If
    34. Case "Ripple Sort"
    35. If chbUmlaute.Checked = False Then
    36. modSortWort.rippleWortSort(wortArray)
    37. ElseIf chbUmlaute.Checked = True Then
    38. modSortWortUmlaut.rippleWortSortUmlaut(wortArray)
    39. End If
    40. Case "Intern Sort"
    41. If chbUmlaute.Checked = False Then
    42. modSortWort.internWortSort(wortArray)
    43. ElseIf chbUmlaute.Checked = True Then
    44. modSortWortUmlaut.internWortSortUmlaut(wortArray)
    45. End If
    46. Case "Quick Sort"
    47. If chbUmlaute.Checked = False Then
    48. modSortWort.quickWortSort(wortArray, LBound(wortArray), UBound(wortArray))
    49. ElseIf chbUmlaute.Checked = True Then
    50. modSortWortUmlaut.quickWortSortUmlaut(wortArray, LBound(wortArray), UBound(wortArray))
    51. End If
    52. End Select
    53. modSortWort.worteSchreiben(strText, wortArray)
    54. txtSortiert.Text = strText
    55. ElseIf optZeichen.Checked = True Then
    56. 'Zeichen Sortierung
    57. Select Case strVerfahren
    58. Case "Bubble Sort"
    59. If chbUmlaute.Checked = False Then
    60. txtSortiert.Text = modSortZeichen.bubbleSort(strText)
    61. ElseIf chbUmlaute.Checked = True Then
    62. txtSortiert.Text = modSortZeichenUmlaut.bubbleSortUmlaut(strText)
    63. End If
    64. Case "Ripple Sort"
    65. If chbUmlaute.Checked = False Then
    66. txtSortiert.Text = modSortZeichen.rippleSort(strText)
    67. ElseIf chbUmlaute.Checked = True Then
    68. txtSortiert.Text = modSortZeichenUmlaut.rippleSortUmlaut(strText)
    69. End If
    70. Case "Intern Sort"
    71. If chbUmlaute.Checked = False Then
    72. txtSortiert.Text = modSortZeichen.internSort(strText)
    73. ElseIf chbUmlaute.Checked = True Then
    74. txtSortiert.Text = modSortZeichenUmlaut.internSortUmlaut(strText)
    75. End If
    76. Case "Quick Sort"
    77. If chbUmlaute.Checked = False Then
    78. modSortZeichen.quickSortLL(strText, 1, Len(strText))
    79. ElseIf chbUmlaute.Checked = True Then
    80. modSortZeichenUmlaut.quickSortUmlaut(strText, 1, Len(strText))
    81. End If
    82. txtSortiert.Text = strText
    83. End Select
    84. End If
    85. 'Zeit
    86. mdatEndeZeit = Microsoft.VisualBasic.DateAndTime.Timer
    87. dblTotalZeit = mdatEndeZeit - mdatStartZeit
    88. lblSortierzeit.Text = Format(dblTotalZeit, "0.0000000") & " Sek"


    Danke für eure Hilfe
    Ich habe den Fehler nun gefunden..... in der Ereignisprozedur cmdSortieren musste am Anfang noch folgendes stehen um das Vorherige Sortierergebnis zu löschen. Die Zeit wurde angezeigt.

    VB.NET-Quellcode

    1. txtSortiert.Text = "" 'Vorheriges Sortierergebnis verwerfen


    Habe es noch mit Stopwatch versucht. Funktioniert gut
    Habe jedoch auch hier Zeitunterschiede festgestellt, wenn ich den gleichen Text mit dem gleichen Sortierverfahren verwendet habe.
    Vielleicht wird die Zeitmessung noch durch irgendetwas beeinflusst. (evtl vom Prozessor ?)

    VB.NET-Quellcode

    1. Private Sub cmdSortieren_Click(sender As System.Object, e As System.EventArgs) Handles cmdSortieren.Click
    2. txtSortiert.Text = "" 'Vorheriges Sortierergebnis verwerfen
    3. Dim strVerfahren As String = lstSortierverfahren.SelectedItem
    4. Dim strText As String = txtText.Text
    5. Dim SortierString As String = txtText.Text 'Für Quicksort
    6. Dim wortArray() As String
    7. lblSortierzeit.Text = "berechne.." & " Sek"
    8. Dim sw As New Stopwatch
    9. sw.Start()
    10. 'If ....
    11. 'Select Case ...
    12. 'Aufruf der Sortierverfahren in Modulen
    13. 'If ...
    14. 'Select Case ...
    15. 'Aufruf der Sortierverfahren in Modulen
    16. Dim elapsed As Double
    17. elapsed = sw.Elapsed.TotalSeconds
    18. sw.Stop()
    19. lblSortierzeit.Text = Format(elapsed, "0.000000000") & " Sek"
    20. sw.Reset()
    Vielleicht wird die Zeitmessung noch durch irgendetwas beeinflusst. (evtl vom Prozessor ?)

    Hallo,
    die Zeitmessung selbst ist schon sehr genau..
    aber...
    Dein Programm wird "beeinflusst". Du wirst selten genau 2 gleiche Ergebnisse haben.

    Das liegt einfach daran, das der Rechner während du sortierst 1000 Dinge macht.
    z.B.
    - unten Rechts im Tray zählt die Uhr weiter
    - dein Wlan hat gerade ein neues Netz entdeckt und schnaggelt mit dem rum
    - Dein Mailprgramm checkt gerade wiedermal ob neue Post da ist
    - die NSA lädt sich gerade deine aktuelle Steuererklärung herunter :)
    - Windows ist der Meinung gerade jetzt den Speicher etwas Freiräumen zu müssen
    - das gesamte Message-System funkt dazwischen (gerade hier im Forum findest du ja viele Beispiele, wie diese auf eigene Dinge umgelenkt werden, die dann unvorhersagbar was machen

    Also :) Du siehst es gibt Millionen Dinge die deine Sortierzeit beeinflussen.
    Das Messen ist genau, aber was so alles zwischen START und STOP passiert.. das ändert sich andauernt.

    Mach am besteren Mehrere Messungen und nimm den Durschnitt.
    Nein, die Messung ist genau. Die StopWatch zumindest. Die läuft entweder über den Systemzeitgeber oder über den highresolution Performancecounter. Je nach Hardware kann die Nanosekunden Genauigkeit erreichen. Das reicht doch locker.
    @ outlop Das System hat Timer on Board, die von älteren Sprachen (VB6) verwendet werden und es gibt Multimedia-Timer, die genauer sind. Die StopWatch-Klasse verwendet immer den besseren vorhandenen:
    alte Hardware - System -Timer,
    neue Hardware - Multimedia-Timer.
    Mit einer StopWatch-Messung bist Du also immer bestens bedient.
    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!

    ErfinderDesRades schrieb:

    Ähm
    Ich meinte die Zeitbasis des Betriebssystems, ein OnBoard-Timer oder ein Multimedia-Timer. Nicht aber das .NET-Timer-Control.
    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!
    ich nutze übrigens gewöhnlich für Benchmarks die Umkehrung des StopWatch-Konzepts: Ich gebe eine Zeit vor, und lasse den kritischen Code so lange in einer Schleife ausführen, bis die Zeit um ist.
    Je mehr Umdrehungen absolviert wurden, desto besser die Performance.
    In Heap - performante sortierte Datenstruktur wende ich das an.

    ErfinderDesRades schrieb:

    so lange in einer Schleife ausführen
    Das macht sich aber bei Bruchteilen von Schleifendurchläufen eher ungut.
    Bruchteile von Zeiteinheiten hingegen sind gut handhabbar.
    Vorschlag: Messen der Zeit für n Durchläufe.
    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!
    ja, aber zb hier bei der Sortiererei musste dafür viel rumprobieren, um zb Mengen zu erzeugen, die sowohl in Quicksort als auch in Bubblosort in einem einigermaßen Zeitrahmen zu sortieren sind. Weil was in Quicksort in 500ms sortiert ist, da kannste in Bubblesort dann vlt. 20s drauf warten.

    Ist klar, ist ungenau - aber bei Benchmarks gibts eh keine Genauigkeit.
    Man braucht es ja nur Größenordnungsmäßig - also wenn ich eine Optimierung code, und die bringt nur 20% (so genau ist mein Messverfahren sicher!), dann verzichte ich lieber drauf, weil Optimierungen schlecht wartbar sind. Also eine Optimierung sollte mindestens das doppelte bringen, lieber noch das hundertfache (was beim Sortieren, und auch bei Suchvorgängen durchaus drin ist)