Frage an string, vb6, profiling, timer – Wie man die Zeit in Millisekunden vergeht

6

Da die Leistung der String-Verkettung in VB6 ziemlich schwach ist, teste ich mehrere StringBuilder-Implementierungen. Um zu sehen, wie lange sie ausgeführt werden, verwende ich derzeit die integrierte

Timer

Funktion, die nur die Anzahl der Sekunden angibt, die nach Mitternacht vergangen sind.

Gibt es eine Möglichkeit (ich denke, durch Importieren einer Systemfunktion), etwas mit Millisekunden-Genauigkeit zu erhalten?

Deine Antwort

8   die antwort
12

DWORD WINAPI GetTickCount(void);

So importieren Sie es in VB6:

Private Declare Function GetTickCount Lib "kernel32" () As Long

Rufen Sie es vor und nach der Operation auf und berechnen Sie dann die verstrichene Zeitdifferenz.

Der Artikel von Raymond Chen (Präzision ist nicht dasselbe wie Genauigkeit) ist jetzt hier zu finden:devblogs.microsoft.com/oldnewthing/20050902-00/?p=34333 Patrick McDonald
GetTickCount hat nur eine Genauigkeit von 10 ms. Wenn Sie eine höhere Genauigkeit benötigen, sollten Sie QueryPerformanceCounter verwenden Patrick McDonald
Ja, der Artikel von Raymondblogs.msdn.com/oldnewthing/archive/2005/09/02/459952.aspx ist nett, er verweist immer noch auf eine Auflösung eines System-Timers, rät jedoch, auch QueryPerformanceCounter zu verwenden, dessen Ausführung ebenfalls einige Zeit in Anspruch nimmt - daher gibt es Kompromisse. Wie auch immer gut zu wissen. justadreamer
1

QueryPerformanceCounter: Um die Zählung zu Beginn und am Ende des Ereignisses zu erhalten.QueryPerformanceFrequency: Um die Anzahl der Ticks pro Sekunde zu erhalten.

Diese verwenden LARGE_INTEGER, um 64-Bit-Zahlen darzustellen.

VB6-Code in diesem MSDN KnowledgeBase-Artikel:support.microsoft.com/kb/172338 MarkJ
-2

: Diagnostics :: Stopwatch zu verwenden

Imports System.Diagnostics

Dim sw As New Stopwatch()
sw.Start()
// do something
LOG("Elapsed " + sw.ElapsedMilliseconds + " ms")
Es tut mir leid. Dann ist GetTickCount in VB6 genau das Richtige, da es die Alternative zu clock_t in C / C ++ ist Ezekiel Rage
.NET StopWatch verwendet QueryPerformanceCounter / QueryPerformanceFrequency nach Möglichkeit im Hintergrund (Sie können herausfinden, ob es verwendet wird, indem Sie die IsHighResolution-Eigenschaft von StopWatch untersuchen). Patrick McDonald
Dies ist .NET-Code, sagte er speziell VB6 (das war die letzte Version vor der Veröffentlichung von .NET 1.0) Matthew Scharley
7

Option Explicit

Private Declare Function QueryPerformanceCounter Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "Kernel32" (X As Currency) As Boolean

Private m_startTime As Currency
Private m_freq As Currency
Private m_overhead As Currency

Public Sub start()
    QueryPerformanceCounter m_startTime
End Sub

Public Function ElapsedSeconds() As Double
    Dim currentTime As Currency
    QueryPerformanceCounter currentTime
    ElapsedSeconds = (currentTime - m_startTime - m_overhead) / m_freq
End Function

Public Function ElapsedMilliseconds() As Double
    ElapsedMilliseconds = ElapsedSeconds * 1000
End Function

Private Sub Class_Initialize()
    QueryPerformanceFrequency m_freq
    Dim ctr1 As Currency
    Dim ctr2 As Currency
    QueryPerformanceCounter ctr1
    QueryPerformanceCounter ctr2
    m_overhead = ctr2 - ctr1
End Sub

Sie können es wie folgt verwenden:

Dim sw as StopWatch
sw = New StopWatch
sw.Start

' Code you want to time

Debug.Print "Code took " & sw.ElapsedMilliseconds " ms"
Dies ist auch sehr nützlich, um Debug-Statistiken zu sammeln oder einen Performance-Logger zu implementieren. RobertB
1

in der er einige angehende Ingenieure interviewt.

Er bittet sie, die Lautstärke einer Glühbirne zu bestimmen. Kandidat A misst es und verwendet dann die Formel für das Volumen einer Kugel und eine andere Formel für das Volumen des Halses und so weiter. Kandidat B füllt es mit Wasser und gießt es in einen Messbecher. Was glaubst du, wer hat den Job bekommen?

Führen Sie es 1000 Mal aus und schauen Sie vorher und nachher auf Ihre Uhr. Sekunden = Millisekunden.

2

Ihre Routinen aus einer Schleife mit genügend Iterationen aufzurufen, um einen messbaren Zeitunterschied zu erhalten.

0

lasse sein). Mit diesem Code können Sie bis zu sechs Timer mit hoher Genauigkeit verwalten:

Option Explicit

Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

Private cFrequency As Currency
Private cCounters(0 To 5) As Currency

Public Sub StartCounter(Optional lCounterIndex As Long)
    QueryPerformanceFrequency cFrequency
    QueryPerformanceCounter cCounters(lCounterIndex)
End Sub

Public Function GetCounter(Optional lCounterIndex As Long) As Double
    Dim cCount As Currency

    QueryPerformanceFrequency cFrequency
    QueryPerformanceCounter cCount
    GetCounter = Format$((cCount - cCounters(lCounterIndex) - CCur(0.0008)) / cFrequency, "0.000000000")
End Function

Public Function Scientific(ByVal dValue As Double) As String
    Dim lMultiplier As Long
    Dim vNames As Variant

    lMultiplier = 5
    vNames = Array("peta", "tera", "giga", "mega", "kilo", "", "milli", "micro", "nano", "pico", "femto")
    If Abs(dValue) < 1 Then
        While Abs(dValue) < 1
            dValue = dValue * 1000
            lMultiplier = lMultiplier + 1
        Wend
    ElseIf Abs(dValue) >= 1000 Then
        While Abs(dValue) >= 1000
            dValue = dValue / 1000
            lMultiplier = lMultiplier - 1
        Wend
    End If

    Scientific = Format$(dValue, "0.000") & " " & vNames(lMultiplier)
End Function

Verwandte Fragen