我的代码如下:
#Const debuggingEnabled = False
Sub debugMessage(str As String)
#If debuggingEnabled Then
Debug.Print str
#End If
End Sub
Sub doThings()
debugMessage "test" 'Does this get optimised away, or must it be explicitly
'wrapped with `#If .. #End If` every time it's called
'if one is to avoid the jump and stack push/pop ops?
End Sub
Microsoft 的 VBA 编译器是否优化了对不执行任何操作的过程的调用? 我怎样才能找到答案?
将其从评论升级为答案:
“优化掉”包含单个、一位、二进制、布尔测试的过程有什么意义?您确定这占了执行时间的很大一部分吗?这种可能性相当渺茫。
在优化之前,请务必进行一些分析,这样您就不会浪费时间并担心占执行时间 0.0001% 的代码片段。
VBA 没有本机分析器,但有第三方选项,其中一些是免费的。这是其中之一,并附有一本具有指导意义的读物:分析和优化 VBA 作者:布鲁斯·麦克弗森。 DuckDuckGo 搜索 还提供了大量其他线索。
所以,你原来问题的答案是:我不认为 VBA 优化了这样的过程,但我不完全确定,无论哪种方式,它都很可能完全无关。在担心优化之前,请务必进行一些分析,这样您就可以明智地利用时间。经过分析后,您几乎总是会发现您认为减慢程序速度的因素实际上非常快,而罪魁祸首是其他因素。
据我所知,VBA 解释器几乎没有进行优化。如果您在 VBE 调试模式下对此进行测试,您可以看到执行跳转到“空”子目录。 但我本以为额外的开销无论如何都会被 VBA 执行的其余部分淹没。