“检查不平等和设置”或“直接设置”变量是否更快?

时间:2013-03-22 09:00:57

标签: variables

哪一个更快:

if (someValue != otherValue) someValue = otherValue;

someValue = otherValue;

或者它们会被优化为相同的代码吗?

2 个答案:

答案 0 :(得分:0)

在我使用的代码库中,大多数对象设置器都有类似的东西:

void SetSomeValue(T otherValue)
{
    if(someValue!=otherValue)
    {
       cout << "Somevalue has changed from " << someValue << " to " << othervalue << endl;
       someValue=otherValue;
    }
}

这使得非开发调试变得更容易。 (是的,它会在日志中放入大量文本,但我们可以使用运行时开关打开或关闭日志记录,这只是一个示例)。

答案 1 :(得分:0)

这是微优化的一个案例(关于这个问题,请参见Jeff Atwood's 2005 post)。如果您真的担心在项目中使用哪个,请不要。 非常高的可能性根本不重要

然而,如果您有兴趣了解为什么可能存在差异,请继续阅读。

是否存在速度差异(甚至哪一个在整体性能方面可能更好)取决于多种因素,包括变量的数据类型,编程语言和用户的系统架构。 / p>

在使用int的C ++中,在绝大多数情况下,您的“直接设置”代码段将比“检查和设置”代码段更快。这是因为当值相等时执行的比较和分支(或比较和条件移动或等效)实际上将慢于将要执行的(不需要的)移动。然而,差异是如此之小,以至于在它产生影响之前你必须多次这样做。此外,优化编译器可能会为您删除死代码。

当然也有可能的例外情况。一个潜在的情况是高速缓存一致的多处理器系统,其中写入导致其他处理器使其高速缓存行无效,即使该值没有改变(我不确定这种情况经常发生的情况,但似乎至少可能)。然后,如果经常读取变量但不经常更改(即代码运行多次,但通常情况为someValue == otherValue),最好先进行检查。类似地,在内存绑定程序中,检查缓存是否总是刷新到内存(对于直写缓存)或者在写入时设置脏位(对于写回缓存)可能是有意义的,即使价值没有改变(再次,听起来似乎合理)。

如果someValueotherValue是更复杂的类型,其中比较和/或赋值已被覆盖,则两个给定的代码片段可能甚至不等同,更不用说性能了。