小编Joe*_*win的帖子

Excel VBA自动实例化的糟糕表现是一个神话吗?

人们普遍认为,使用类似的结构Dim dict As New Dictionary比表现更差Dim dict As Dictionary / Set dict = New Dictionary.

解释是前一个例子 - 自动实例化 - 推迟实例化直到第一次使用变量dict.因此,每次引用dict时,编译的代码必须首先检查是否dict等于Nothing.

但是我发现编译代码无论如何都会这样做.每当您尝试使用对象引用时,您将收到错误Nothing.

所以,为了向科学致敬,我进行了一些测试.结果表明两种方法之间没有性能差异.(在Excel 2007上运行)

拨打"创建字典并添加2项"100,000次.

  • 明确:16,891ms /自动:16,797ms(自动94ms更快)
  • 明确:16,797ms /自动:16,781ms(自动快16ms)

反转测试呼叫的顺序:

  • 自动:16,766ms /明确:16,812ms(自动快46ms)
  • 自动:16,828ms /明确:16,813ms(明确快15ms)

调用"创建字典并添加6项"100,000次.

  • 自动:17,437ms /明确:17,407ms(明确快30ms)
  • 自动:17,343ms /明确:17,360ms(自动快17ms)

创建字典并添加100,000个项目.

  • 自动:391ms /明确:391ms(相同)

创建字典并添加1,000,000个项目.

  • 自动:57,609ms /明确:58,172ms(自动563ms更快)
  • 明确:57,343ms /自动:57,422ms(明确快79ms)

我没有看到任何迹象表明自动实例化与显式实例化的表现不佳.(要明确的是,出于其他原因,我会避免自动实例化,但我只是对这里的性能角度感兴趣.)

这是一个神话吗?

UPDATE

让我列出为什么表演论点对我没有意义.有人说

x.Add("Key", "Item")
Run Code Online (Sandbox Code Playgroud)

在自动实例化的对象中等效于以下内容:

If x is Nothing then
    Set x = New Dictionary
End If
x.Add("Key", "Item")
Run Code Online (Sandbox Code Playgroud)

如果你这几千次打电话,这会让它看起来像"令人恐惧的开销".但是在显式实例化情况下,它正是代码编译版本中生成的逻辑形式:

If …
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba

12
推荐指数
1
解决办法
1338
查看次数

标签 统计

excel ×1

excel-vba ×1

vba ×1