我最近不得不深入研究一些VB6代码,我看到了这个模式:
dim o as obj
set o = new obj
Run Code Online (Sandbox Code Playgroud)
为什么不呢?
dim o as new obj
Run Code Online (Sandbox Code Playgroud)
我记得15年前有一个很好的理由,但我不记得它现在是什么.谁还记得吗?原因仍然有效吗?
人们普遍认为,使用类似的结构Dim dict As New Dictionary比表现更差Dim dict As Dictionary / Set dict = New Dictionary.
解释是前一个例子 - 自动实例化 - 推迟实例化直到第一次使用变量dict.因此,每次引用dict时,编译的代码必须首先检查是否dict等于Nothing.
但是我发现编译代码无论如何都会这样做.每当您尝试使用对象引用时,您将收到错误Nothing.
所以,为了向科学致敬,我进行了一些测试.结果表明两种方法之间没有性能差异.(在Excel 2007上运行)
拨打"创建字典并添加2项"100,000次.
反转测试呼叫的顺序:
调用"创建字典并添加6项"100,000次.
创建字典并添加100,000个项目.
创建字典并添加1,000,000个项目.
我没有看到任何迹象表明自动实例化与显式实例化的表现不佳.(要明确的是,出于其他原因,我会避免自动实例化,但我只是对这里的性能角度感兴趣.)
这是一个神话吗?
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)