在vba中使用变体对性能有害吗?

时间:2015-01-14 09:41:20

标签: vba variables vb6

我认为标题非常简单,将变量声明为变体而不是特定数据类型对VBA的性能有何影响?

也许是因为我不熟悉编程,但直觉上它应该会降低性能,因为计算机必须检查分配了哪种数据类型,然后将变量更改为指定的数据类型,而不是立即分配它的价值。我还没有找到一些关于此的文献。

2 个答案:

答案 0 :(得分:13)

这取决于。变体比原生类型慢,但在大多数程序中,它根本不重要。大多数宏很小,在运行时会被编译,差异可能只有几微秒,你无法察觉。

变种有它们的优点,我喜欢它们。

所以这取决于你在做什么。如果您的程序眨眼间运行,那么避免变体就没有优势。如果需要时间,请强烈输入变量(并正确声明对象 - 见下文)。

如果表现有问题,除此之外还有其他一些事情,我将在下面提及。

一般问题

设置属性或调用方法时,每个都是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和第34号命令。 "当然,结果是"。

从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/

答案 1 :(得分:-1)

在vba中使用变体对性能有害吗? - 是的!

应尽可能避免

Variant。 (有一些合法的用途)

One example of a reputable resource supporting this view