【问题标题】:"Dim myarray() as String" VS "Dim myarray() as Variant"“将 myarray() 调暗为字符串” VS “将 myarray() 调暗为变体”
【发布时间】:2015-07-16 19:15:04
【问题描述】:

假设会分配不必要的大量内存,我总是害怕将事物声明为 Variants。

最近致力于提高电子表格的性能,但我得到了相反的印象(见下面的编辑):Dim myarray() as VariantDim 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


【解决方案1】:

将数组声明为数组将保存的任何数据类型是有意义的,这为将来查看您的代码的任何人提供了清晰的信息。通常最好让您的代码具有可读性,牺牲一点内存节省(尽管这可能取决于场景)。例如,如果您的数组将只包含字符串,则将该数组声明为字符串。然而,如果您的数组将包含整数和字符串的混合,则应使用变体。

本质上,将数组声明为数据类型,这对于数组将要保存的内容是合乎逻辑的。

如果要从工作表中填充数组,则必须将变量声明为变体。尝试填充已声明为字符串的数组(使用工作表中的值)将导致“类型不匹配”调试消息,无论范围的值是否都是字符串。

这是一些与 VBA 中的数组相关的 MSDN documentation

这就是我在声明数组时所遵循的。让未来的开发人员更容易阅读代码 > 少量节省内存。

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2014-05-16
    • 2020-10-09
    • 2018-09-25
    • 2013-04-20
    相关资源
    最近更新 更多