用于比较值类型的短路运算符的.Net性能?
Posted
技术标签:
【中文标题】用于比较值类型的短路运算符的.Net性能?【英文标题】:.Net performance of short-circuiting operators for comparing a value type? 【发布时间】:2013-11-01 00:20:20 【问题描述】:如果我比较两个已知的值类型,我会从 c# 中的 |
或 ||
运算符获得更好的性能吗?
我的特殊用例是类中的 bool
成员,指示陈旧数据,被这样的循环方法激活:
private bool _stale;
private HashSet<Foo> _foos;
然后另一个方法循环并可能激活此标志
foreach (var foo in foos)
_stale = _foos.Add(foo) | _stale;
//Or is the following line better?
//_stale = _foos.Add(foo) || _stale;
我想我是在问短路运算符的开销是否足够,以至于我不会使用它来检查已分配的值类型...
【问题讨论】:
双向编写代码。测量性能。你怎么知道这两件事中哪一个更快? @EricLippert 您可能是少数可能知道而不构建测试的人之一... 我向你保证,这不是真的;如果我学到了关于性能分析的一件事,那就是猜测两件事中哪一个更快是没有意义的。 【参考方案1】:我会使用Or Assignment operator:
_stale |= added;
或者:
_stale |= _foos.Add(foo);
此运算符是专门为此目的而设计的,它使意图明确(并且很可能在性能方面是最好的,因为它是专门为此目的而设计的)。
至于实际性能,这种级别的微优化通常几乎无法衡量,因为性能上的任何差异都将远小于代码清晰度的操作差异(HashSet<T>.Add
调用)重要得多。您可以构建一个测试来衡量这一点,但在性能方面不太可能存在足够可靠的差异。
【讨论】:
我不清楚 msdn。.Add()
是否保证被执行?
@Matthew 每次都会执行。
我知道这是一种微优化......但我可以“优化”它而不牺牲清晰度和不费力气那么为什么不呢?
@Matthew 嗯,牺牲清晰度是这里的关键——在这种情况下,我认为我的选择是最清晰的版本,这就是我更喜欢它的原因;)
我完全同意,+1 ...我以前从未使用过此运算符。以上是关于用于比较值类型的短路运算符的.Net性能?的主要内容,如果未能解决你的问题,请参考以下文章
python 第11课 布尔值 比较运算符 逻辑运算符 短路问题
python 第11课 布尔值 比较运算符 逻辑运算符 短路问题