【发布时间】:2015-07-16 19:15:04
【问题描述】:
假设会分配不必要的大量内存,我总是害怕将事物声明为 Variants。
最近致力于提高电子表格的性能,但我得到了相反的印象(见下面的编辑):Dim myarray() as Variant 与 Dim myarray() as String 相比提高了性能
这两种声明的主要区别和后果是什么?
在这里找不到明确的指导:https://msdn.microsoft.com/en-us/library/aa711948.aspx
编辑:受控性能测试
我运行了一个受控性能测试(取dim myarray() as Variant 版本,复制一份并将两个变量更改为Dim myarray() as String)
正如您在下面看到的,我弄错了,性能差异并不显着。
Dim myarray() as Variant VERSION
Start 4:05:47 PM
FXLoaded 4:05:47 PM 00:00
TDLoaded 4:06:38 PM 00:51
LisofPCTD 4:06:57 PM 00:19
YDLoaded 4:07:47 PM 00:50
LisofPCYD 4:08:14 PM 00:27
PrintCoBTD 4:08:46 PM 00:32
PrintCoBYD 4:09:18 PM 00:32
Total 03:31 03:31
Dim myarray() as String VERSION
Start 4:25:53 PM
FXLoaded 4:25:53 PM 00:00
TDLoaded 4:26:53 PM 01:00
LisofPCTD 4:27:10 PM 00:17
YDLoaded 4:28:07 PM 00:57
LisofPCYD 4:28:32 PM 00:25
PrintCoBTD 4:29:03 PM 00:31
PrintCoBYD 4:29:34 PM 00:31
Total 03:41 03:41
【问题讨论】:
-
你唯一改变的就是把
Variant换成String?您是否对代码进行了计时以验证您对速度提高的假设? -
您提供的链接是与 VB.Net 不直接相关的链接。考虑到它们的灵活性,我非常喜欢对数组使用变体,尤其是使用语法
Dim myarray As Variant(一种可以保存数组而不是变体数组的变体。我已经使用了多达 100,000 个条目(或更多) 没有问题,但 YMMV。 -
@JohnColeman 我还没有这方面的消息来源,但我认为您正在那里回答问题。数组是我见过的唯一建议使用
Variant类型的类型。当您使用String类型时,您必须考虑将字符串定义为数组所需的所有额外字符。 -
@Chrismas007 我认为你是对的,持有数组是 VBA 中变体的主要有效用例,尽管我认为出于某种原因,如果你想使用变体作为循环变量使用 for-each 循环遍历用户定义的集合或字典,即使该集合是已知的,例如保持字符串。
-
感觉如何?您真的需要像原来一样对其进行基准测试,然后进行一次更改并再次进行基准测试。众所周知,我们人类不善于判断时间。
标签: vba excel declaration variant