3

想象一下,我有一个名为 X 的变量。假设每 5 秒我想让 X = true。(在这 5 秒之间可能为真或假,但在 5 秒结束时重置为真)。

检查该值是否已经为真,如果不是,则将其重新分配为真会更有效吗?还是只有 X = true?

换句话说,哪个会跑得更快?

if(x==false){
    x = true;
}

对比

x = true;

一方面,如果不需要,第一个程序不会改变变量。另一方面,第二个程序不需要检查 X 等于什么;它直接潜入。

4

4 回答 4

8
  • 这几乎总是无关紧要的。编写最容易理解和维护的代码。仅在必要时对其进行优化。
  • 最好的确定方法是测试它。分析您的代码。
  • 哪个更快可能取决于浏览器。
  • 哪个更快取决于变量通常为真还是通常为假。
  • 话虽如此,我猜在大多数情况下设置一个变量而不测试它会更快。
于 2010-06-14T16:59:58.793 回答
4

真的取决于你的数据:)

如果 x == false 90% 的时间,那么直接分配给 x 会更快。

这是您可能不想担心效率的地方之一,如果您真的这样做,请对其进行分析..

于 2010-06-14T17:01:05.753 回答
2

免责声明/警告:

这是一个微优化,永远不会以用户可衡量的方式影响程序的效率。如果您关闭所有编译器优化,并运行一个出色的分析器,您可能能够量化效果 - 但没有用户会注意到。

对于您的情况尤其如此,其中有问题的代码仅每隔几秒钟运行一次。花在分析上的时间可能最好花在改进应用程序的其他部分上。

此外,在这些情况下,可读性应始终优于非瓶颈微优化(尽管我在下面的回答仅根据要求考虑运行时效率)。因此,我建议您在这种情况下使用的代码是x=true,因为它最容易阅读和理解。

最后,如果添加检查会提高速度,编译器可能已经知道这一点并且会为你做这件事,所以你不会出错x=true(这就是为什么你应该在运行分析器之前关闭优化)。


回答:

解决这个问题的唯一真正方法是通过分析。您可能会发现 0 测试 (x==false) 基本上不需要任何时间,因此值得包括,因为当 x 为真时它节省了时间。或者您可能会发现测试花费的时间足够长,以至于当 x 为假时会浪费太多时间。

我的猜测是测试是不必要的。那是因为 0 测试和其他按位运算(和、或等)都非常快,以至于我通常将它们视为花费相同的基本时间。如果 0-testing 与 OR 操作(设置为 true)花费相同的时间,那么 0-testing 就是多余的时间浪费。分析当然可以证明我错了,我的猜测是基于对按位运算的松散假设,所以如果你选择运行分析器并弄清楚这一点,我肯定会对结果感兴趣。

于 2010-06-14T17:15:53.417 回答
1

与您的整体设计质量所获得的效率相比,您试图通过这种方式获得的效率是微不足道的。

于 2010-06-14T17:07:24.810 回答