哪个更有效:每次分配或检查?
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 访问,因为通常需要继续执行该值,并且写入只是在执行继续时放入队列中。现在检查变得很昂贵,最好不检查就写。
现在考虑写入对象使其“变脏”并强制进行其他处理的情况。一个例子是将值绑定到显示的对象。分配给该值会变得非常昂贵,因为它涉及显示更新,而读取它则不需要。显示更新是异步的,因此使用指标可能不会注意到它,但它会影响整个应用程序。所以在这种情况下检查可能会好得多。这是一种需要认真思考的情况。
大多数时候,您可以在考虑上下文的同时仔细考虑一下,从而知道哪个更好。但是,如果您必须 运行 指标来确定哪个是哪个,通常最终差异很小,以至于不足以产生代码复杂性成本。您最终可能会过度优化您的应用程序,导致无法维护。
假设你有一个变量 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 访问,因为通常需要继续执行该值,并且写入只是在执行继续时放入队列中。现在检查变得很昂贵,最好不检查就写。
现在考虑写入对象使其“变脏”并强制进行其他处理的情况。一个例子是将值绑定到显示的对象。分配给该值会变得非常昂贵,因为它涉及显示更新,而读取它则不需要。显示更新是异步的,因此使用指标可能不会注意到它,但它会影响整个应用程序。所以在这种情况下检查可能会好得多。这是一种需要认真思考的情况。
大多数时候,您可以在考虑上下文的同时仔细考虑一下,从而知道哪个更好。但是,如果您必须 运行 指标来确定哪个是哪个,通常最终差异很小,以至于不足以产生代码复杂性成本。您最终可能会过度优化您的应用程序,导致无法维护。