哪个if语句在VBA中执行得更快?

Cor*_*ter 2 excel vba excel-vba

在VBA中,以下哪个if语句表现更好?

上下文:我正在迭代查找条目的工作表.

if [condition1] and [condition2] and [condition3] then
    *do something*
end if
Run Code Online (Sandbox Code Playgroud)

要么

if [condition1] then
    if [condition2] then
        if [condition3] then
            *do something*
        end if
    end if
end if
Run Code Online (Sandbox Code Playgroud)

我的直觉说第二个语句,因为它只需要在进行下一次迭代之前检查一个初始条件,但是这样吗?还有,有更好的方法吗?

Mic*_*zyn 7

这里的链接可能会有所帮助.

通常,第二个会因为简单的原因而执行得更快:如果第一个条件失败,则不会检查其他两个.在第一种方法中,它必须评估所有三个条件.在其他编程语言中,您有短路,这是您在第二种方法中实现的(在VBA中,它必须以这种方式完成,因为没有短路).


Mat*_*don 7

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源.然而,我们不应该放弃那个关键的3%的机会.

- 唐纳德克努特

假设没有任何条件有副作用,基本上归结为:

If True And True And False Then
Run Code Online (Sandbox Code Playgroud)

然后你过度思考它并且可能过度优化而没有任何有意义的性能提升.停止尝试从代码中挤出每纳秒,并编写易于阅读,维护,调试和扩展的代码:如果代码中的任何地方存在性能瓶颈,则不在此处.


上下文:我正在迭代查找条目的工作表.

看,迭代查看条目的工作表 你的瓶颈.与工作表交互比与内存数组交互慢几百甚至几千倍.

所以是的,因为你正在编写昂贵的代码,缺少短路产生影响,但不是因为短路更有效地使用布尔逻辑 - 它会产生[潜在的重大]差异,因为你将是有条件地避免昂贵的工作表读取.

如果这听起来很矛盾,那么你就没有明白我的观点:布尔逻辑短路对已经有效的代码的性能影响在很大程度上是微不足道的.

继续,尝试转储Range你正在迭代(并且你正在做一个For或一个For Each循环?两者之间很大的差异,取决于你正在做什么)到2D数组,然后使用For循环迭代它并寻找你的参赛作品.我承诺比分离条件以模拟短路的任何事情都要显着提高性能.

或者,也许重新评估是否需要迭代任何东西.如果您正在寻找一个条目,并且根据您的数据的样子,您可以将"条件列"合并为一个,并用于Application.WorksheetFunction.Match定位条目而无需编写任何循环或条件.