VBA中建立Function的耗时

概述

设计算法时,可以把部分功能做成一个Function,这样既可以使代码更易于阅读,又可以进行代码重用。但其会额外开销硬件资源,这就要测一测到底慢多少。

注:在传递参数时,若使用byval,则要建立参数的副本,对于数据量大的数组,建立副本会很消耗时间,所以建议大家尽量使用byref。本测试中全部用byref,以避免建立副本带来的开销。

测试速度的代码

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

Private m_Frequency   As Currency
Private m_Start       As Currency
Private m_Now         As Currency
Private m_Available   As Boolean

Sub TestSpeet()

m_Available = (QueryPerformanceFrequency(m_Frequency) <> 0)
If Not m_Available Then
Debug.Print "Performance Counter not available"
End If

Dim i As Long
Dim a As Long, b As Long, c As Long

QueryPerformanceCounter m_Start

For i = 1 To 1000000 Step 1
    ' 下面五句中选一行执行
    a = b + c          ' 不用函数
    a = ToDo0()        ' 零个参数
    a = ToDo1(a)       ' 一个参数
    a = ToDo2(a, b)    ' 两个参数
    a = ToDo3(a, b, c) ' 三个参数
Next i

QueryPerformanceCounter m_Now

Elapsed = 1000 * (m_Now - m_Start) / m_Frequency
Debug.Print Format(Elapsed, "#.0000")
End Sub

Function ToDo0() As Long
ToDo = ToDo + ToDo
End Function
Function ToDo1(a As Long) As Long
ToDo = ToDo + ToDo
End Function
Function ToDo2(a As Long, b As Long) As Long
ToDo = ToDo + ToDo
End Function
Function ToDo3(a As Long, b As Long, c As Long) As Long

测试结果

测试结果的时间单位是毫秒。

测试顺序不用函数零个参数一个参数两个参数三个参数
18.000289.913792.746398.8352101.6376
28.050689.626193.101698.8160101.3602
37.989189.807693.072599.5525101.3064
48.075089.803992.867898.6769101.3559
58.005889.924592.947699.6873101.1559
68.106689.463893.433698.9042101.2353
77.971289.852193.287798.7279100.8427
88.073289.476893.245399.2764101.1488
98.265289.789792.995298.6070101.5662
107.995690.250493.043799.0390101.6802

结论

Function确实额外开销硬件资源。

100万次调用,消耗了81ms,即1亿次,消耗8s。

所以,对于调用次数不多、时间要求不苛刻的情况,完全可以考虑把整篇的代码分割成多个函数。

反之则要少用。比如两个10万行的表进行笛卡尔积对比,哪怕每次对比仅仅调用一次,那也是10万乘以10万,即一百亿次调用,也就是800s,13min。

我采用了两全其美的办法:把所有数据传入函数,而不是每条数据挨个调用函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值