作者:sa沙沙ssa | 来源:互联网 | 2023-05-26 19:48
我想标题非常简单,将变量声明为变体而不是特定数据类型对VBA的性能有何影响?
也许是因为我不熟悉编程,但直觉上它会降低性能,因为计算机必须检查分配了哪种数据类型,然后将变量更改为指定的数据类型,而不是立即将值赋给它.我还没有找到一些关于此的文献.
1> 小智..:
这取决于.变体比原生类型慢,但在大多数程序中,它根本不重要.大多数宏很小并且在运行时会被编译,差异可能是几微秒,你无法察觉.
变体有它们的优点,我喜欢它们.
所以这取决于你在做什么.如果您的程序眨眼间运行,那么避免变体就没有优势.如果需要时间,请强烈键入变量(并正确声明对象 - 请参阅下文).
如果表现是一个问题,除此之外还有其他一些事情,我将在下面提到.
一般问题
设置属性或调用方法时,每个都是CPU中的函数调用.这意味着堆栈设置开销.函数调用比内联代码慢.出于同样的原因,在VBA中使用循环而不是函数.
F或开头不会一遍又一遍地指定所有这些属性.除非你改变它们,否则它们不会改变.
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
For loop to go through each word pair
.Text = SrcText
.Replacement.Text = DestText
.Find.Execute Replace:=wdReplaceAll
Next
End With
最小化点
因此,如果您对性能最小化点(每个点是查找)感兴趣,尤其是在循环中.
有两种方法.一种是如果要多次访问,则将对象设置为最低对象.
例如(慢)
set xlapp = CreateObject("Excel.Application")
msgbox xlapp.worksheets(0).name
(更快,因为每次使用对象时都会忽略一个点)
set xlapp = CreateObject("Excel.Application")
set wsheet = xlapp.worksheets(0)
msgbox wsheet.name
第二种方式是.您一次只能有一个活动的.
这会跳过100次查找.
with wsheet
For x = 1 to 100
msgbox .name
Next
end with
字符串Concatination
并且不要一次加入一个字符串.从Vbscript程序员那里看到这一点.它需要50,000个字节,并且需要多次分配和释放才能生成100个字符的字符串.
http://blogs.msdn.com/b/ericlippert/archive/2003/10/20/53248.aspx
阅读属性
不要重新读取不会更改的属性,尤其是在进程外或后期绑定时.把它们放入一个变量中.
对象类型
这里有两个概念 - 进程内外或早期或晚期绑定.
exefiles与进程外连接.所有调用都通过RPC(网络协议)进行编组.Dllfiles正在进行中,函数调用直接通过跳转进行.
早期绑定是set x = objecttype
.编写程序时会查找函数.在执行时,程序被硬编码以跳转到存储在该函数的vtable中的地址.
设置后期绑定x = createobject("objecttype")
.每个函数调用都是这样的."嗨对象你有一个打印命令"."是",它回答说,"命令3"."嗨,对象可以请你做3号命令"."当然,这是结果".
从Visual Basic概念(帮助的一部分)
通过优化Visual Basic解析对象引用的方式,可以使Visual Basic应用程序运行得更快.Visual Basic处理对象引用的速度可能受以下因素影响:
ActiveX组件是否已实现为进程内服务器或进程外服务器.
对象引用是早期绑定还是后期绑定.通常,如果组件已作为可执行文件(.exe文件)的一部分实现,则它是进程外服务器并在其自己的进程中运行.如果它已实现为动态链接库,则它是进程内服务器,并在与客户端应用程序相同的进程中运行.
使用进程内服务器的应用程序通常比使用进程外服务器的应用程序运行得更快,因为应用程序不必跨越进程边界来使用对象的属性,方法和事件.有关进程内和进程外服务器的更多信息,请参阅"进程内和进程外服务器".
如果对象引用使用声明为特定类的变量的对象变量,则它们是早期绑定的.如果对象引用使用声明为通用Object类的变量的对象变量,则它们是后期绑定的.使用早期绑定变量的对象引用通常比使用后期绑定变量的对象引用运行得更快.
Excel特定
请参阅Microsoft人员的此链接.这是excel特定而不是VBA.Autocalc和其他计算选项/屏幕更新等
http://blogs.office.com/2009/03/12/excel-vba-performance-coding-best-practices/
.