C :使用goto加速循环
C++: speeding up a for-loop using goto?
在以下 for
-loop中,如果conditionA
,conditionB
和conditionC
我什么都不做,所有这些都对true
进行了评估。
for (int i = 0; i < imax; ++i) {
bool conditionA;
// evaluate conditionA
bool conditionB;
// evaluate conditionB
bool conditionC;
// evaluate conditionC
if (conditionA && conditionB && conditionC) continue;
// do something
}
如果conditonA
评估false
,则不必评估conditionB
和conditionC
。因此,似乎我可以通过以下方式编写循环加快循环。
for (int i = 0; i < imax; ++i) {
bool conditionA;
// evaluate conditionA
if (conditionA) {
bool conditionB;
// evaluate conditionB
if (conditionB) {
bool conditionC;
// evaluate conditionC
if (conditionC) continue;
}
}
// do something
}
现在,这看起来很丑陋,乍一看尚不清楚。似乎使用臭名昭著的goto
代码变得更加优雅:
for (int i = 0; i < imax; ++i) {
bool conditionA;
// evaluate conditionA
if (!conditionA) goto doSomething;
bool conditionB;
// evaluate conditionB
if (!conditionB) goto doSomething;
bool conditionC;
// evaluate conditionC
if (conditionC) continue;
doSomething:
// do something
}
此功能是加速循环的方法,还是编译器足够聪明,以至于代码的第一个版本实际上与第二版和第三版一样快?如果不是,是否有比使用goto
更好的选择?
i会将条件的评估移至单独的功能,然后做:
for (int i = 0; i < imax; ++i) {
if (conditionA() && conditionB() && conditionC()) continue;
// do something
}
如果conditionA
返回false
,conditionB
将永远不会被调用,等等。
这也将使您的功能更短,更简洁,将职责划分为其他功能。
如果您没有充分的理由进行这样的"提早出口",则可以避免完全使用continue
:
for (int i = 0; i < imax; ++i) {
if (!(conditionA() && conditionB() && conditionC())) {
// do something
}
}
或使用de Morgan的定律获取!conditionA() || !conditionB() || !conditionC
-无论您喜欢哪个。
在尝试加快一些速度之前,请查阅循环确实是瓶颈。如果不是这样,请留出代码可读且可维护(而不是也许略快,也许 slow shouts 肯定是错误的且难以理解的混乱),并将其留给您的编译器的功能加快事情的速度。
如果循环是瓶颈,请尝试想到的一切, profile it it,并比较结果。没有人可以肯定地说您的编译器可能会优化什么。
在微观性能优化时,除了您的探查器以外,永远不要相信任何人。编译器在优化和如何优化方面有所不同,并且人类在预测这些优化的节省方面特别糟糕。
但是,如果条件不太复杂,我敢打赌,编译器将无论如何都会优化布尔变量,并留下
之类的东西for (int i = 0; i < imax; ++i) {
if(evalConditionA() && evalConditionB() && evalConditionC())
continue;
doSomething:
}
您总是能做的就是将任何条件的概率提高到任何情况下,并将最有可能触发短路评估的一个条件放在第一个条件下,因此其他情况不需要经常进行评估。
一如既往,如果您想知道性能,只需做一个基准即可。否则,我认为最好的解决方案确实取决于您的上下文。例如,如果您可以在估值或单独的功能(或最坏的情况下为宏)中,您的第一个解决方案是最好的:
:for (int i = 0; i < imax; ++i) {
if (! (evaluate conditionA) && (evaluate conditionB) && (evaluate conditionC)) {
// do something
}
}
然后,懒惰的评估将提供帮助,根据您的工作,您的编译器可能能够通过一些优化选项优化评估。
我还建议您不要使用if (condition) continue;
,而是使用if (!condition) { /* do something */ }
,这有助于更好地理解该算法。别忘了有一天有人会读您的代码,并且某人可能是您!
c 编译器(至少是Visual Studio)已经完成了您的需求。
if( bCondA && bCondB && bCondC )
如果bconda == false,则未经验证。对于所有编译器,都应该是正确的。
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 加速C++练习2.4
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 使用.push_back加速循环
- C :使用goto加速循环
- 为什么 OpenMP 不加速基本循环?
- 对于循环在 gcc -O3 使用 OpenMP 优化后不会加速
- 如何使用MySQL将c++for循环代码加速到查询中
- 多线程c++程序加速一个求和循环
- 为球体的体积加速代码(嵌套while循环)
- 如何在php中通过数组加速循环
- OpenMP并行循环加速问题