String 如何以毫秒为单位获取经过的时间

String 如何以毫秒为单位获取经过的时间,string,vb6,profiling,timer,String,Vb6,Profiling,Timer,由于VB6中字符串连接的性能非常差,我正在测试几个StringBuilder实现。为了查看它们运行了多长时间,我目前使用内置的 Timer 函数,它只给出午夜后经过的秒数 有没有办法(我想是通过导入系统函数)获得毫秒精度的东西?是的,您可以使用Win32 API: DWORD WINAPI GetTickCount(void); 要在VB6中导入,请按如下方式声明: Private Declare Function GetTickCount Lib "kernel32" () As Long

由于VB6中字符串连接的性能非常差,我正在测试几个StringBuilder实现。为了查看它们运行了多长时间,我目前使用内置的

Timer
函数,它只给出午夜后经过的秒数


有没有办法(我想是通过导入系统函数)获得毫秒精度的东西?

是的,您可以使用Win32 API:

DWORD WINAPI GetTickCount(void);
要在VB6中导入,请按如下方式声明:

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

在操作之前和之后调用它,然后计算经过的时间差。

您可以尝试使用System::Diagnostics::Stopwatch

Imports System.Diagnostics

Dim sw As New Stopwatch()
sw.Start()
// do something
LOG("Elapsed " + sw.ElapsedMilliseconds + " ms")

您可以使用两个Win32 API:

  • :获取事件开始和结束时的计数
  • :获取每秒的滴答数

它们使用大整数表示64位数字。

将以下代码放入秒表类中:

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
您可以按如下方式使用它:

Dim sw as StopWatch
sw = New StopWatch
sw.Start

' Code you want to time

Debug.Print "Code took " & sw.ElapsedMilliseconds " ms"

在MSDNKB文章

< P>中有代码和解释,您也可以考虑使用不同的方法。试着从一个循环中调用你的例程,并进行足够的迭代,以给你一个可测量的时差。

有一个托马斯·爱迪生的故事,他正在采访一些未来的工程师

他让他们确定灯泡的体积。候选A对其进行测量,然后使用球体体积公式和颈部体积公式,依此类推。候选人B将其装满水,并将其倒入量杯中。你认为谁得到了这份工作


跑1000次,前后看看手表。秒=毫秒。

我总是在某个模块中使用它(尽管可能在类中)。此代码允许您维护多达六个计时器,具有高精度:

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
选项显式
私有声明函数QueryPerformanceFrequency Lib“kernel32”(lpFrequency作为货币)的长度
私有声明函数QueryPerformanceCounter库“kernel32”(lpPerformanceCount作为货币)的长度为
专用频率作为货币
作为货币的私人会计(0到5)
公共子StartCounter(可选lCounterIndex,长度相同)
查询性能频率C频率
QueryPerformanceCounter计数器(lCounterIndex)
端接头
公共函数GetCounter(可选lCounterIndex,长度相同)为双精度
作为货币记账
查询性能频率C频率
QueryPerformanceCounter帐户
GetCounter=格式$((Account-Accounters(lCounterIndex)-CCur(0.0008))/cf频率,“0.000000000”)
端函数
公共函数Scientific(ByVal-dValue为Double)为字符串
暗倍增管
Dim vNames作为变体
l倍增管=5
vNames=阵列(“peta”、“tera”、“giga”、“mega”、“kilo”、“milli”、“micro”、“nano”、“pico”、“femto”)
如果Abs(dValue)<1,则
而Abs(dValue)<1
D值=D值*1000
L倍增管=L倍增管+1
温德
ElseIf Abs(dValue)>=1000然后
而Abs(d值)>=1000
D值=D值/1000
l倍增管=l倍增管-1
温德
如果结束
科学=格式$(dValue,“0.000”)和“&vNames(lMultiplier)
端函数

这是.NET代码,他特别说VB6(这是.NET 1.0发布之前的最后一个版本)对不起,我的错。然后,GetTickCount是在VB6中使用的方法,因为它是C/C++中clock_t对象的替代品。NET秒表尽可能在后台使用QueryPerformanceCounter/QueryPerformanceFrequency(您可以通过检查秒表的IsHighResolution属性来确定是否使用了它)这对于收集一些调试统计信息或实现性能记录器也非常有用。GetTickCount的精度仅为10ms,如果需要更高的精度,则应使用QueryPerformanceCountermsdn。它没有说明10ms,但说明:“分辨率仅限于系统计时器的分辨率。此值还受GetSystemTimeAdjustment函数所做调整的影响。“因此,也许10ms适用于您的特定机器?GetTickCount在大多数情况下都足够好,只要您知道它的局限性,请尝试使用该代码,但要让自己确信10ms的精度是在任何Windows系统上都能达到的最佳精度是的,Raymond的文章很好,他仍然提到了系统计时器的分辨率,然而,他建议也使用QueryPerformanceCounter,这也需要一些时间来执行-因此有一些折衷。不过,很好知道。仅供参考陈雷蒙的文章(精度与精度不同)现在可以在以下位置找到:本MSDN知识库文章中的VB6代码: