短路是否会使程序执行得更快,分析在条件语句中先放哪条语句值得吗?
Does short circuiting make execution of the program faster, and is analysing which statement to put first in the condition statement worth it?
例如(假设我们正在谈论 C++,如果有区别的话),
在 && 运算符中,如果我知道一个语句将导致 0 more often/has 的可能性更高,那么我应该将另一个语句放在左侧,另一个语句放在右侧吗?
同样适用||运算符如果我知道一个语句会导致 1 个 often/has 一个更高的机会那么另一个语句我应该把它放在左边,另一个语句在右边吗?
现在做所有这些会花费很多时间来分析程序,但是如果这确实加快了程序的执行时间,那么值得这样做吗?embedded/real-time 系统程序员会研究这个问题吗?必要时加快他们的申请?
你还要考虑,每一方的评估成本是多少。
if (veryCostlyOftenFalse() && veryCheapRareFalse()) // may be faster other way around
除非超过 50% 的源代码是表达式求值和分支,否则我会说这是最后的优化方法,当您对其他一切都满意时。
embedded/real-time 应用程序程序员的关注顺序大致如下:
- 当然是算法,找到速度与 space 的合理权衡。
- 内存中的数据结构(当这些算法运行时,尽可能频繁地访问缓存)。
- 使用真实数据分析真实应用程序,查看是否存在一些意外瓶颈并修复这些瓶颈。
- 如果你在某个地方绝望地错过了一两个时钟,并且周围有一些复杂的
if
,那么是的,它可能会有所帮助...
首先,确保您不是过早优化的受害者。
话虽如此,请确保您已尽一切努力来加快程序的瓶颈。
在某些情况下,按照您所说的短路操作可能是个好主意,但这在很大程度上取决于您的所有陈述。
例如,如果您有类似的内容:
if(slowFunction() && complexConditionRootsAndExponents && ConditionUsuallyZero)
那么您可能希望最后一个学期是第一个,不是吗?
但是,请注意,按逻辑顺序排列事物并不总是微不足道的。例如查看我在 Why this program printed fork 4 times? 中的回答,从中可以看出短路会影响程序的执行流程。
TL;DR
虽然一般来说,通过排列条件中的术语来获得显着的加速是很少见的。 关注你程序的瓶颈并尽可能地解决它!
问题的答案是:是的,它确实会影响性能。
寻找可以改进的位置和更改程序所带来的性能提升是否值得所付出的代价只有您自己才能回答。
在大多数情况下,性能变化会很小,但如果涉及的某些操作成本很高,则可能会很大。
请注意,也可能存在正确性问题。例如,如果在 if (foo() || bar())
中,如果 foo
returns 为真,则永远不会调用 bar
很重要,那么重新排序调用将是一个错误。
首先确保您的程序正确。那么,if就太慢了;分析它并优化它会产生最大影响的地方。 可能是短路上下文中的评估顺序,但在大多数情况下,它会是其他东西。
视情况而定。
如果语句简单如:
if(y == 4 || x == 2)
并假设 x == 2 的频率要高得多,这样我们就可以通过这样写来缩短执行:
if(x == 2 || y == 4)
但是你看我们不会从中得到太多好处,因为语句非常简单,在这个级别优化代码可能不那么值得。
现在考虑一个例子:
if(y == an_expensive_function() || x == 2)
这里假设 an_expensive_function() 是一个非常昂贵的操作,说它的复杂度是指数级的,这样的语句绝对有意义:
if(x == 2 || y == an_expensive_function())
执行短路。
嵌入式和应用程序开发人员或任何开发人员一开始可能不会考虑以如此精细的粒度进行优化,如果这不会给他们带来很多好处。如果事情对他们来说一切顺利,他们甚至可能不会考虑它。
所以作为开发者我们需要检查一下,分析优化到这样一个层次的代码需要多少时间,我们从中得到了多少收益。
当然可以。如果您的条件是以下形式:
if ( x() && y() ) ...
而且 y 的计算成本很高,而 x 很便宜并且经常失败,
这将提高代码的本地性能。
所以你想知道:
- 是程序中对性能敏感的部分的条件(如果不是,优化它没有意义,为清楚起见而写)
- 短路表达式的组件计算的相对成本
- 哪些廉价计算经常失败(对于 &&)或成功(对于 ||)。
在这种情况下,通常值得重新排列短路表达式元素。
例如(假设我们正在谈论 C++,如果有区别的话), 在 && 运算符中,如果我知道一个语句将导致 0 more often/has 的可能性更高,那么我应该将另一个语句放在左侧,另一个语句放在右侧吗?
同样适用||运算符如果我知道一个语句会导致 1 个 often/has 一个更高的机会那么另一个语句我应该把它放在左边,另一个语句在右边吗?
现在做所有这些会花费很多时间来分析程序,但是如果这确实加快了程序的执行时间,那么值得这样做吗?embedded/real-time 系统程序员会研究这个问题吗?必要时加快他们的申请?
你还要考虑,每一方的评估成本是多少。
if (veryCostlyOftenFalse() && veryCheapRareFalse()) // may be faster other way around
除非超过 50% 的源代码是表达式求值和分支,否则我会说这是最后的优化方法,当您对其他一切都满意时。
embedded/real-time 应用程序程序员的关注顺序大致如下:
- 当然是算法,找到速度与 space 的合理权衡。
- 内存中的数据结构(当这些算法运行时,尽可能频繁地访问缓存)。
- 使用真实数据分析真实应用程序,查看是否存在一些意外瓶颈并修复这些瓶颈。
- 如果你在某个地方绝望地错过了一两个时钟,并且周围有一些复杂的
if
,那么是的,它可能会有所帮助...
首先,确保您不是过早优化的受害者。
话虽如此,请确保您已尽一切努力来加快程序的瓶颈。
在某些情况下,按照您所说的短路操作可能是个好主意,但这在很大程度上取决于您的所有陈述。
例如,如果您有类似的内容:
if(slowFunction() && complexConditionRootsAndExponents && ConditionUsuallyZero)
那么您可能希望最后一个学期是第一个,不是吗?
但是,请注意,按逻辑顺序排列事物并不总是微不足道的。例如查看我在 Why this program printed fork 4 times? 中的回答,从中可以看出短路会影响程序的执行流程。
TL;DR
虽然一般来说,通过排列条件中的术语来获得显着的加速是很少见的。 关注你程序的瓶颈并尽可能地解决它!
问题的答案是:是的,它确实会影响性能。
寻找可以改进的位置和更改程序所带来的性能提升是否值得所付出的代价只有您自己才能回答。
在大多数情况下,性能变化会很小,但如果涉及的某些操作成本很高,则可能会很大。
请注意,也可能存在正确性问题。例如,如果在 if (foo() || bar())
中,如果 foo
returns 为真,则永远不会调用 bar
很重要,那么重新排序调用将是一个错误。
首先确保您的程序正确。那么,if就太慢了;分析它并优化它会产生最大影响的地方。 可能是短路上下文中的评估顺序,但在大多数情况下,它会是其他东西。
视情况而定。 如果语句简单如:
if(y == 4 || x == 2)
并假设 x == 2 的频率要高得多,这样我们就可以通过这样写来缩短执行:
if(x == 2 || y == 4)
但是你看我们不会从中得到太多好处,因为语句非常简单,在这个级别优化代码可能不那么值得。
现在考虑一个例子:
if(y == an_expensive_function() || x == 2)
这里假设 an_expensive_function() 是一个非常昂贵的操作,说它的复杂度是指数级的,这样的语句绝对有意义:
if(x == 2 || y == an_expensive_function())
执行短路。
嵌入式和应用程序开发人员或任何开发人员一开始可能不会考虑以如此精细的粒度进行优化,如果这不会给他们带来很多好处。如果事情对他们来说一切顺利,他们甚至可能不会考虑它。 所以作为开发者我们需要检查一下,分析优化到这样一个层次的代码需要多少时间,我们从中得到了多少收益。
当然可以。如果您的条件是以下形式:
if ( x() && y() ) ...
而且 y 的计算成本很高,而 x 很便宜并且经常失败, 这将提高代码的本地性能。
所以你想知道:
- 是程序中对性能敏感的部分的条件(如果不是,优化它没有意义,为清楚起见而写)
- 短路表达式的组件计算的相对成本
- 哪些廉价计算经常失败(对于 &&)或成功(对于 ||)。
在这种情况下,通常值得重新排列短路表达式元素。