在VBA中,以下哪个if语句会表现更好?
上下文:我正在寻找一个条目的工作表。
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
我的直觉说第二个陈述,因为它只需要在进行下一次迭代之前检查一个初始条件,但是这样吗? 还有,有更好的方法吗?
答案 0 :(得分:7)
这里的link可能会有所帮助。
一般来说,第二个会因为简单的原因而执行得更快:如果第一个条件失败,则不会检查其他两个。在第一种方法中,它必须评估所有三个条件。在其他编程语言中,您有短路,这是在第二种方法中实现的(在VBA中必须以这种方式完成,因为没有短路)。
答案 1 :(得分:7)
我们应该忘记小的效率,大约97%的时间说:过早优化是所有邪恶的根源。然而,我们不应该在关键的3%中放弃我们的机会。
- 唐纳德克努特
假设没有任何条件产生副作用,基本上归结为:
If True And True And False Then
然后你过度思考它并且可能过度优化而没有任何有意义的性能提升。不要试图从代码中挤出每纳秒,并编写易于阅读,维护,调试和扩展的代码:如果代码中的任何地方存在性能瓶颈,那么&#39 ;不在这里。
背景信息:我正在寻找一个条目的工作表。
请参阅遍历工作表,查找条目 是您的瓶颈。与工作表交互比与内存数组交互慢几百甚至几千倍。
是的,因为您正在编写昂贵的代码,缺少短路会有所作为,但不是因为短路更有效率使用布尔逻辑 - 它会产生[潜在的重大]差异,因为您将有条件地避免昂贵的工作表读取。
如果这听起来很矛盾,那你就不明白我的观点:布尔逻辑短路对已经有效的代码的性能影响基本上无关紧要。
继续,尝试转储Range
您正在迭代(并且您是使用For
还是For Each
循环进行转换?There's a massive difference between the two,具体取决于您正在做什么)进入2D数组,然后使用For
循环迭代它并查找您的条目。我承诺比分离条件以模拟短路的任何事情都要显着提高性能。
或者,或许可以重新评估是否需要迭代任何东西。如果您正在寻找条目,并且根据您的数据的样子,您可以合并"条件列"到一个并使用Application.WorksheetFunction.Match
来定位条目而不写任何循环或条件。
答案 2 :(得分:1)