0

以下哪项对性能更好?

  • 使用模块级私有变量和子程序的子程序

  • 将变量显式传递给函数并使用定义的函数将变量显式分配给调用者:OutputVariables = MyLittleProcedure(InputVariables)。

4

1 回答 1

2

我不认为对于这个性能问题真的有一个万能的答案,除了它可能不值得冒险。一般的编程良好实践说坚持局部变量以避免对全局变量的意外更改(特别是如果该变量被用于多个函数,并且在回调或事件中使用时更是如此)。据我所知,VBA 是单线程的,所以至少你不必担心同时访问全局变量(互斥体和信号量......挠头)。具有局部变量的函数也更容易在其他程序中调试、验证和重用。

现在理论上,如果您经常调用具有大量大局部变量的相当小/短的函数,则与变量初始化相关的开销(VBA 会这样做,但例如 C 不会)可能会给全局变量带来性能优势。如果您要传递多个参数,则必须将这些参数从调用内存复制/复制到函数堆栈(再次开销)。在任何情况下,将大数组作为函数参数传递都是作为指针 (ByRef) 传递的,并且数据实际上驻留在全局内存空间中。

对于反例,非常大量的全局变量一直保留在内存中,使您的程序内存很饿(与在函数调用之间回收的局部变量内存相比),并减慢您的系统整体速度。此外,本地参数和变量位于堆栈上,甚至可能在处理器寄存器中,因此内存访问应该更快(这些天在 64 位地址空间中可能不是问题,但我猜 - 自从我有一段时间以来第三年的计算机科学,我不太确定这些天 Windows 如何处理内存分段、分页、虚拟化、保护等)。

最后一点,如果您开始担心内存管理的性能开销,那么您可能无论如何都不应该使用 VBA 进行编码。我记得在 turbo pascal 编码的图形函数中看到内联汇编代码,其中每条指令都经过仔细考虑以提高性能。如果我记得的话,他们使用带参数的局部变量和函数:)

于 2021-03-16T09:53:57.723 回答