哪个更有效:每次分配或检查?

Which is more efficient: assigning every time or checking?

假设你有一个变量 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 是否已经为真会更有效吗?

换句话说,哪个更有效:检查冗余还是每次都分配?

很大程度上取决于上下文。对于您的微不足道的示例,Sven 说它可能针对作业进行了优化是正确的。但如果没有,您将花费额外的内存周期进行检查。即使它确实得到了优化,它仍然会增加必须维护的代码复杂性。如果您处理的是更复杂的实体,情况可能会大不相同。

考虑这样一种情况,当其他处理正在进行时读取值被延迟,例如一个同步的 Web 访问,因为通常需要继续执行该值,并且写入只是在执行继续时放入队列中。现在检查变得很昂贵,最好不检查就写。

现在考虑写入对象使其“变脏”并强制进行其他处理的情况。一个例子是将值绑定到显示的对象。分配给该值会变得非常昂贵,因为它涉及显示更新,而读取它则不需要。显示更新是异步的,因此使用指标可能不会注意到它,但它会影响整个应用程序。所以在这种情况下检查可能会好得多。这是一种需要认真思考的情况。

大多数时候,您可以在考虑上下文的​​同时仔细考虑一下,从而知道哪个更好。但是,如果您必须 运行 指标来确定哪个是哪个,通常最终差异很小,以至于不足以产生代码复杂性成本。您最终可能会过度优化您的应用程序,导致无法维护。