Performance VBA中变量声明的性能优势?
在函数的开头标注变量与在使用变量之前声明变量相比,是否有性能优势 我在MS Access 2003中使用VBA 例如Performance VBA中变量声明的性能优势?,performance,ms-access,vba,Performance,Ms Access,Vba,在函数的开头标注变量与在使用变量之前声明变量相比,是否有性能优势 我在MS Access 2003中使用VBA 例如 Function f(y As Long) As Long Dim x As Long If y <> 0 Then x = 1000000 End If End Function 函数f(y等于长)等于长 暗x等长 如果y为0,那么 x=1000000 如果结束 端函数 诗句 Function f(
Function f(y As Long) As Long
Dim x As Long
If y <> 0 Then
x = 1000000
End If
End Function
函数f(y等于长)等于长
暗x等长
如果y为0,那么
x=1000000
如果结束
端函数
诗句
Function f(y As Long) As Long
If y <> 0 Then
Dim x As Long
x = 1000000
End If
End Function
函数f(y等于长)等于长
如果y为0,那么
暗x等长
x=1000000
如果结束
端函数
VBA绝对没有区别。声明变量只会影响设计时调试(IDE将知道要显示什么自动完成(intellisense))。在这种情况下,它根本不会影响性能。我也做过很多VBA宏,这是我注意到的一件事
作为演示,只要尝试在Dim
语句上设置断点,您就会看到它不允许您这样做。这是因为此指令从未执行,仅用于指导实时调试引擎
希望对Wadih M的答案有所帮助,所有声明的变量都在编译过程之前进行初始化,无论它们在过程中的位置如何 要测试这一点,请尝试在不声明变量的情况下使用变量(您确实使用Option Explicit,对吗?): 选项显式 私有子对象(未声明) 暗x等长 调试。打印x 调试。打印y 端接头
这将返回一个“变量未定义错误”,断点是过程声明,即在执行任何代码之前,未声明的变量y突出显示。代码本身的性能不符合Wadih的回答 但是在维护代码方面的性能,是肯定的。
我要说的是,大多数程序员希望在函数顶部定义变量。 像你提供的一个简单的例子,这并不重要。但是,代码中穿插着变量声明的复杂函数会让它感觉混乱。从而降低了读取和摸索代码的时间。从而增加了维护所需的时间
在循环中声明一个变量而不打算这样做也可能存在问题。因此,每次循环迭代都会重置变量
在维护代码时,代码本身的性能往往不如性能重要。我认为你说的“VBA绝对没有区别”是错误的。例如,如果您运行此代码
Private Sub test2()
zz = Timer
For i = 1 To 100000000
x = x + 1
Next
Debug.Print "No décalartion : " & Timer - zz
yy = Timer
Dim y As Long
For i = 1 To 100000000
y = y + 1
Next
Debug.Print "No décalartion : " & Timer - yy
End Sub
你会得到这个结果
无décalartion:3746094
décalartion:1855469
因此,变量声明提高了性能
关于是的,我确实使用Option Explicit。感谢您的帮助。“在循环中声明变量而不打算这样做也可能会有问题。因此,变量在每次循环迭代中都会重置”--没有问题:变量不会在每次迭代中重置。“我想大多数程序员都希望变量在函数顶部定义”--可能是VBA程序员。大多数C#NET程序员应该期望变量在第一次使用/需要时被声明,我怀疑VB.NET程序员也在这样做。这是对@Wadih M.于2009年3月19日20:47发布的答案的一次尝试。实际上,造成差异的原因不是声明,而是不同的数据类型。尝试将x=x+1替换为:x&=x&+1-您注意到时间现在应该是相同的(因为&意味着使用长数据类型,而不是像您的示例中那样使用默认的单浮点或双浮点)。
Private Sub test2()
zz = Timer
For i = 1 To 100000000
x = x + 1
Next
Debug.Print "No décalartion : " & Timer - zz
yy = Timer
Dim y As Long
For i = 1 To 100000000
y = y + 1
Next
Debug.Print "No décalartion : " & Timer - yy
End Sub