【问题标题】:Is checking a property value before setting, and setting only if different, quicker or slower than setting blindly?是否在设置之前检查属性值,并且仅在不同时设置,比盲目设置更快或更慢?
【发布时间】:2014-12-09 16:36:16
【问题描述】:

请任何人告诉我,如果在 C#.Net 中,在设置之前检查属性值更高效,并且仅在值不同时设置,还是盲目地将其设置为新值更高效?

例如:

bool newActiveState = true;

// Only set the value if it differs
if(myObject.IsActive != newActiveState )
{
     myObject.IsActive = newActiveState;
}

对

bool newActiveState = true;

// Set it blindly
myObject.IsActive = newActiveState;

一种方法对编译器的帮助是否比另一种更好?有一种方法可以提供更好的编译器提示吗?

我知道,如果有任何收获,那只是微优化,但在大规模嵌套递归循环中可能很容易知道。

根据 ~Adam Houldsworth 的澄清问题进行更新:

假设它只是一个普通的属性,没有代码在设置时运行,但后来的代码读取了属性值,然后只执行耗时的过程,所以不在此代码的范围内。

【问题讨论】:

  • 这取决于设置的数据大小,以及值变化时是否运行任何代码。
  • 这取决于数据,但仅对于简单的bool 字段,差异可以忽略不计(如果有)。绝对是微优化。
  • 好的,所以假设它只是一个普通的属性并且没有代码在设置时运行,但是稍后的代码会读取属性值并且只执行耗时的过程,所以不在此代码的范围内。我会用这个更新问题。

标签: c# optimization properties setting


【解决方案1】:

根据您的说明,没有其他代码作为设置属性的直接结果被执行,那么进行检查没有任何好处。

要更详细地查看它,请考虑您的代码:

if (myObject.IsActive != newActiveState)
{
    myObject.IsActive = newActiveState;
}

显然,如果值不相等并且您最终设置了该值,那么 CPU 所做的总工作量将超过盲目设置值。也就是说,它必须检查并设置变量。

如果值相等,则它必须检查并围绕集合进行分支。

所以

  • 如果检查和分支比写入快
  • 并且在检查和分支中节省的时间弥补了额外的写入时间
  • 那么条件可以更快

您必须进行一些分析以确定设置值与未设置值的频率,并使用该分析来确定这两种情况的总时间。然后,您可以根据您预期的集合/分支比率得出该位代码的平均时间。然后,您可以将该数字与相同数量的盲写所花费的总时间进行比较。

不过,我会为您省去麻烦。如果分支和盲写之间存在差异,那将非常非常小。可能只有几分之一微秒。写入会很快,因为要写入的内存位置已经在 CPU 的缓存中。无论分支和写入之间有什么不同(如果有的话),它都无法弥补条件测试的额外成本。

【讨论】:

  • 谢谢,我不知道读写速度之类的东西。此外,我不知道 CLR 是否具有已经应用的相等检查或优化,所以我不必这样做。我完全可以看到,如果我的 setter 有昂贵的代码,那是有优势的,但不确定 setter 是否不贵。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多