使用模块级私有变量和 subs 而不是使用 VBA for Excel 中的函数传递变量会影响性能吗?
Does performance suffer for using module-level Private variables and subs instead of passing variables using functions in VBA for Excel?
以下哪个对性能更好?
为子例程使用模块级私有变量和子程序
将变量显式传递给函数并赋值
使用定义的函数显式地向调用者提供变量:OutputVariables = MyLittleProcedure(InputVariables).
我不认为对于这个性能问题有一个千篇一律的答案,除了它可能不值得冒这个风险。一般编程的良好做法是坚持局部变量以避免意外更改全局变量(特别是如果变量在多个函数中使用,在回调或事件中使用时更是如此)。据我所知,VBA 是单线程的,所以至少你不必担心同时访问全局变量(互斥量和信号量...抓挠头 ).具有局部变量的函数也更易于调试、未来验证和在其他程序中重用。
理论上,如果您经常调用带有大量局部变量的 small/short 函数,则与变量初始化相关的开销(VBA 会,但例如 C 不会) 可能会给全局变量带来性能优势。如果要传递多个参数,则这些参数必须是 copied/duplicated 从调用内存到函数堆栈(再次开销)。在任何情况下将大数组作为函数参数传递作为指针(ByRef)传递,数据实际上驻留在全局内存中space.
作为反例,大量的全局变量始终保留在内存中,使您的程序内存不足(与在函数调用之间回收的局部变量内存相比),并使您的系统整体变慢。此外,局部参数和变量位于堆栈上,甚至可能位于处理器寄存器中,因此内存访问应该更快(这些天在 64 位地址 space 中可能不是什么问题,但我猜 - 它一直是虽然自从我学习了三年级的计算机科学之后,我不太确定 windows 如今如何处理内存分段、分页、虚拟化、保护等)。
最后一点,如果您开始担心内存管理的性能开销,您可能不应该在 VBA 中编码。我记得在 turbo pascal 编码的图形函数中看到了内联汇编代码,其中每条指令都经过仔细考虑以提高性能。如果我记得的话,他们使用局部变量和带参数的函数 :)
以下哪个对性能更好?
为子例程使用模块级私有变量和子程序
将变量显式传递给函数并赋值 使用定义的函数显式地向调用者提供变量:OutputVariables = MyLittleProcedure(InputVariables).
我不认为对于这个性能问题有一个千篇一律的答案,除了它可能不值得冒这个风险。一般编程的良好做法是坚持局部变量以避免意外更改全局变量(特别是如果变量在多个函数中使用,在回调或事件中使用时更是如此)。据我所知,VBA 是单线程的,所以至少你不必担心同时访问全局变量(互斥量和信号量...抓挠头 ).具有局部变量的函数也更易于调试、未来验证和在其他程序中重用。
理论上,如果您经常调用带有大量局部变量的 small/short 函数,则与变量初始化相关的开销(VBA 会,但例如 C 不会) 可能会给全局变量带来性能优势。如果要传递多个参数,则这些参数必须是 copied/duplicated 从调用内存到函数堆栈(再次开销)。在任何情况下将大数组作为函数参数传递作为指针(ByRef)传递,数据实际上驻留在全局内存中space.
作为反例,大量的全局变量始终保留在内存中,使您的程序内存不足(与在函数调用之间回收的局部变量内存相比),并使您的系统整体变慢。此外,局部参数和变量位于堆栈上,甚至可能位于处理器寄存器中,因此内存访问应该更快(这些天在 64 位地址 space 中可能不是什么问题,但我猜 - 它一直是虽然自从我学习了三年级的计算机科学之后,我不太确定 windows 如今如何处理内存分段、分页、虚拟化、保护等)。
最后一点,如果您开始担心内存管理的性能开销,您可能不应该在 VBA 中编码。我记得在 turbo pascal 编码的图形函数中看到了内联汇编代码,其中每条指令都经过仔细考虑以提高性能。如果我记得的话,他们使用局部变量和带参数的函数 :)