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

在VBA中,下面哪个if语句会performance得更好?

上下文:我遍历一个表单来查找条目。

if [condition1] and [condition2] and [condition3] then *do something* end if 

要么

 if [condition1] then if [condition2] then if [condition3] then *do something* end if end if end if 

我的直觉说第二个陈述,因为它只需要在进行下一个迭代之前检查一个初始条件,但是这样吗? 另外,有没有更好的方法来做到这一点?

我们应该忘记小效率,大约97%的时间: 不成熟的优化是万恶之源 但是,我们不应该把这个关键的3%放在一边。

Donald Knuth

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

 If True And True And False Then 

那么你就是在思考这个问题,可能会过度优化而没有任何有意义的性能收益。 不要试图从你的代码中挤出每纳秒,编写易于阅读,维护,debugging和扩展的代码如果代码中存在性能瓶颈,则不在此处


上下文:我遍历一个表单来查找条目。

看到, 重复通过一张表寻找一个条目 你的瓶颈。 与工作表交互的速度比与内存数组交互的速度慢数百倍(如果不是数千倍)。

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

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

继续,尝试倾销你正在迭代的Range (你是用ForFor Each循环来做什么的? 两者之间有很大的区别 ,取决于你在做什么)到二维数组中,然后使用一个For循环来迭代它并寻找你的条目。 我承诺比任何可以分解条件来模拟短路的性能改进都要显着得多。

或者,也许重新评估是否需要迭代任何东西。 如果您正在查找条目 ,并根据数据的外观,可以将“条件列”合并为一个条目 ,并使用Application.WorksheetFunction.Match来查找条目,而不写入任何循环或条件。

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

一般情况下,秒会执行更快的原因很简单:如果第一个条件失败,它不会检查其他两个。 在第一种方法中,它必须评估所有三个条件。 在其他编程语言中,你有短路,你用第二种方法实现(在VBA中必须这样做,因为没有短路)。

第二种格式是更快的实现。

您可以看到,vba不会通过在立即窗口中尝试以下命令来短路评估:

 if 1=0 and 1/0 then ?"Short Circuit" if 1=1 or 1/0 then ?"Short Circuit" 

如果vba像其他语言一样操作,那么您将得到Short Circuit打印的信息。 相反,你会得到这个错误:
在这里输入图像说明

当然,我会告诉你马太杯的答案 ,因为读入一个范围到内存中比直接读取表单要快得多。

我将把你的回答转到如何读/写数组和单元格的另一个问题上