【问题标题】:Improve VBA Array Read Performance提高 VBA 阵列读取性能
【发布时间】:2017-06-11 00:29:03
【问题描述】:

1.45 亿次数组读取需要 6 秒。怎样才能做得更快?

Dim X As Integer

X = 0
For Y = 1 To 17000
    For Yn = Y To 17000
        d = Ary(Yn, X)
    Next
Next

Ary(Yn, X) 是变体/日期。
Ary 大小约为 17000 x 7

没有数组读取的循环为 1.5 秒。数组读取增加了 6.5 秒。

【问题讨论】:

  • 读取 same 值高达 17,000 次表明您没有使用正确的数据结构。
  • @NOYB 提出问题的方式是X-Y problem。请提供有关您要实现的目标的更多详细信息。
  • 您是如何断定瓶颈一定是您认为“相关”的代码?公认的答案是建议切换语言,因为当不涉及 VBA 代码时,CPU 周期会神奇地更快。如果您想对您的代码进行任何有意义的改进,请将其全部发布到Code Review。在这个网站上,这类问题太宽泛了,请参阅How to Ask
  • 换句话说,你在浪费大家的时间。干杯。
  • 您应该知道,这些类型的问题对于程序员/编码类型的人来说可能超级烦人,他们天生就是好奇的人,喜欢解决问题并喜欢提问关于他们被要求帮助的事情的问题。你对完全合理的请求的“你不需要知道”的回应可以被解读为傲慢/不屑一顾,并不完全鼓励任何人提供帮助。

标签: arrays vba performance


【解决方案1】:

您的代码不完整或没有意义。您读取了 144,508,500 亿次数组的值,但您丢弃了 144,508,499 次结果。

如果你只关心最后的结果,我会为你优化:

Dim X As Integer
d = Ary(17000, X)

告诉我们您真正想做什么,我们会提供更好的答案。

你可以做一些一般的事情:

不要使用 Variant/Date 数组 - 变体使用更多内存,如果从 Excel 中读取它们,则保留区域的日期格式会产生一些开销。使用 Date 数组会更好,我怀疑使用 Doubles 数组会更好。

假设您打算进行某种日期比较,您将多次重新读取多行。考虑使用 Dictionary 对象,您可能会显着减少读取次数。

【讨论】:

  • 代码是循环的相关部分。还有其他使用 d 的处理。这个问题仅与从阵列中获取 d 的性能有关。 Array 是变体类型的 2 维,并填充有日期和值(实数)。我将如何对第 0 列使用 date 类型,对第 1 到第 6 列使用 double 类型?有可能有一个多类型的数组吗?我在任何地方都没有提到 Excel。这严格来说是 VBA。避免绑在物体上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2019-03-21
  • 2011-09-26
  • 2019-04-05
  • 2012-04-10
相关资源
最近更新 更多