2013-06-12 88 views
0

我有一个带有很多循环的“大”vba程序,现在我想要计算每个步骤对应程序的各个命令,当我启动它时,所以也许我可以找到至少不是真正高性能的循环。我想要执行一些步骤。计算程序步骤

现在任何人都知道这是如何工作?或者在Excel2010中已经存在一些这样的功能?

Thx。我知道我的恩里克语不是很好。 >。 <

编辑13年6月14日 现在我把它写,所以我的模块中

Sub DoStuff() 
Dim sw As New Stopwatch 
sw.Start 
Call pranlesen.plan_gen 
sw.Pause 
Debug.Print "SomeFunction took " & format(sw.Elapsed * 1000, "0.000000") & " milliseconds" 
End Sub 

类是正确称为秒表,我不知道有什么缺陷。

回答

2

如果您的意思是“计算处理器指令的数量”,否则没有办法做到这一点。但是,您可以非常准确地测量已用时间。有关使用Windows API功能QueryPerformanceCounter在VBA中构建超精确秒表的详细说明,请参见我的文章Accurate Performance Timers in VBA。下面是秒表类的完整代码:

Option Explicit 

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

Private pFrequency As Double 
Private pStartTS As UINT64 
Private pEndTS As UINT64 
Private pElapsed As Double 
Private pRunning As Boolean 

Private Type UINT64 
    LowPart As Long 
    HighPart As Long 
End Type 

Private Const BSHIFT_32 = 4294967296# ' 2^32 

Private Function U64Dbl(U64 As UINT64) As Double 
    Dim lDbl As Double, hDbl As Double 
    lDbl = U64.LowPart 
    hDbl = U64.HighPart 
    If lDbl < 0 Then lDbl = lDbl + BSHIFT_32 
    If hDbl < 0 Then hDbl = hDbl + BSHIFT_32 
    U64Dbl = lDbl + BSHIFT_32 * hDbl 
End Function 

Private Sub Class_Initialize() 
    Dim PerfFrequency As UINT64 
    QueryPerformanceFrequency PerfFrequency 
    pFrequency = U64Dbl(PerfFrequency) 
End Sub 

Public Property Get Elapsed() As Double 
    If pRunning Then 
     Dim pNow As UINT64 
     QueryPerformanceCounter pNow 
     Elapsed = pElapsed + (U64Dbl(pNow) - U64Dbl(pStartTS))/pFrequency 
    Else 
     Elapsed = pElapsed 
    End If 
End Property 

Public Sub Start() 
    If Not pRunning Then 
     QueryPerformanceCounter pStartTS 
     pRunning = True 
    End If 
End Sub 

Public Sub Pause() 
    If pRunning Then 
     QueryPerformanceCounter pEndTS 
     pRunning = False 
     pElapsed = pElapsed + (U64Dbl(pEndTS) - U64Dbl(pStartTS))/pFrequency 
    End If 
End Sub 

Public Sub Reset() 
    pElapsed = 0 
    pRunning = False 
End Sub 

Public Sub Restart() 
    pElapsed = 0 
    QueryPerformanceCounter pStartTS 
    pRunning = True 
End Sub 

Public Property Get Running() As Boolean 
    Running = pRunning 
End Property 

一个新的类模块在上面的代码粘贴并命名模块“秒表”。然后在你的代码中的任何其他地方你可以做这样的事情:

Sub DoStuff 
    Dim sw As New Stopwatch 
    sw.Start 
    myResult = SomeFunction(A, B, C) 
    sw.Pause 
    Debug.Print "SomeFunction took " & Format(sw.Elapsed * 1000, "0.000000") & " milliseconds" 
End Sub 
+1

谢谢你的答案,确实非常有用! –

+0

感谢您的回答,这可能是有用的,但我不明白,SomeFunction有什么作用? – Synoon

+0

我应该在那里写我的主要功能吗? – Synoon