【发布时间】:2021-11-25 17:08:37
【问题描述】:
假设您有一个变量ididit: mut bool,它控制某事是否已完成,以及一个可以完成该事的循环。出于可视化目的,这里有一些示例代码:
let mut ididit: bool = false;
for i in 0..SomeArbitraryValue {
// do stuff
if (conditions) { // While certainly possible, this probably won't run every iteration.
ididit = true;
}
}
考虑到这一点,在分配之前检查ididit 是否已经为真会更有效吗?
换句话说,哪个更有效:检查冗余还是每次都分配?
【问题讨论】:
-
先检查只会比不先检查慢,但在优化编译时可能没有任何区别。
-
一般来说,回答性能问题的方法是衡量。
-
在你的例子中,最好是在赋值
ididit = true; break;之后打破循环,我们不需要继续检查其他条件。如果分配是一个大结构的克隆,那么之前检查会更好。 -
像所有与性能相关的问题一样,这取决于。如果检查
conditions的成本很高(并且如果您在if中没有做任何其他事情),那么首先检查ididit可能会提高速度(例如if (!ididit) && conditions {…})。否则不检查可能会更快,但差异可能太小而无法衡量。 -
只是为了检查我是否正确理解了这个问题:您正在将问题中的代码
if conditions { ididit = true; }与if conditions { if !ididit { ididit = true; } }之类的代码进行比较。还是您将其与if !ididit { if conditions { ididit = true; } }进行比较?我相信第一个和第二个变体的效率差不多,第二个变体可能会稍微慢一些(但由于优化器的魔力,它们可能会编译成相同的机器代码)。如果conditions的计算成本很高,则第三种变体可能会更有效。
标签: for-loop rust variable-assignment