想象一下,我有一个名为 X 的变量。假设每 5 秒我想让 X = true。(在这 5 秒之间可能为真或假,但在 5 秒结束时重置为真)。
检查该值是否已经为真,如果不是,则将其重新分配为真会更有效吗?还是只有 X = true?
换句话说,哪个会跑得更快?
if(x==false){
x = true;
}
对比
x = true;
一方面,如果不需要,第一个程序不会改变变量。另一方面,第二个程序不需要检查 X 等于什么;它直接潜入。
想象一下,我有一个名为 X 的变量。假设每 5 秒我想让 X = true。(在这 5 秒之间可能为真或假,但在 5 秒结束时重置为真)。
检查该值是否已经为真,如果不是,则将其重新分配为真会更有效吗?还是只有 X = true?
换句话说,哪个会跑得更快?
if(x==false){
x = true;
}
对比
x = true;
一方面,如果不需要,第一个程序不会改变变量。另一方面,第二个程序不需要检查 X 等于什么;它直接潜入。
真的取决于你的数据:)
如果 x == false 90% 的时间,那么直接分配给 x 会更快。
这是您可能不想担心效率的地方之一,如果您真的这样做,请对其进行分析..
免责声明/警告:
这是一个微优化,永远不会以用户可衡量的方式影响程序的效率。如果您关闭所有编译器优化,并运行一个出色的分析器,您可能能够量化效果 - 但没有用户会注意到。
对于您的情况尤其如此,其中有问题的代码仅每隔几秒钟运行一次。花在分析上的时间可能最好花在改进应用程序的其他部分上。
此外,在这些情况下,可读性应始终优于非瓶颈微优化(尽管我在下面的回答仅根据要求考虑运行时效率)。因此,我建议您在这种情况下使用的代码是x=true
,因为它最容易阅读和理解。
最后,如果添加检查会提高速度,编译器可能已经知道这一点并且会为你做这件事,所以你不会出错x=true
(这就是为什么你应该在运行分析器之前关闭优化)。
回答:
解决这个问题的唯一真正方法是通过分析。您可能会发现 0 测试 (x==false) 基本上不需要任何时间,因此值得包括,因为当 x 为真时它节省了时间。或者您可能会发现测试花费的时间足够长,以至于当 x 为假时会浪费太多时间。
我的猜测是测试是不必要的。那是因为 0 测试和其他按位运算(和、或等)都非常快,以至于我通常将它们视为花费相同的基本时间。如果 0-testing 与 OR 操作(设置为 true)花费相同的时间,那么 0-testing 就是多余的时间浪费。分析当然可以证明我错了,我的猜测是基于对按位运算的松散假设,所以如果你选择运行分析器并弄清楚这一点,我肯定会对结果感兴趣。
与您的整体设计质量所获得的效率相比,您试图通过这种方式获得的效率是微不足道的。