2

哪个更快:

if (someValue != otherValue) someValue = otherValue;

或者

someValue = otherValue;

还是将它们优化为相同的代码?

4

2 回答 2

0

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

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

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

于 2013-03-22T09:11:18.360 回答
0

这是一个微优化的案例(参见Jeff Atwood 2005 年关于该主题的帖子)。如果您真的担心在项目中使用哪个,请不要。很有可能根本不重要

但是,如果您有兴趣了解为什么引擎盖下可能存在差异,请继续阅读。

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

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

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

如果someValueotherValue是比较和/或赋值被覆盖的更复杂的类型,那么两个给定的代码甚至可能不等价,更不用说性能了。

于 2013-03-22T17:24:01.967 回答