用于比较值类型的短路运算符的.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&lt;T&gt;.Add 调用)重要得多。您可以构建一个测试来衡量这一点,但在性能方面不太可能存在足够可靠的差异。

【讨论】:

我不清楚 msdn。 .Add() 是否保证被执行? @Matthew 每次都会执行。 我知道这是一种微优化......但我可以“优化”它而不牺牲清晰度和不费力气那么为什么不呢? @Matthew 嗯,牺牲清晰度是这里的关键——在这种情况下,我认为我的选择是最清晰的版本,这就是我更喜欢它的原因;) 我完全同意,+1 ...我以前从未使用过此运算符。

以上是关于用于比较值类型的短路运算符的.Net性能?的主要内容,如果未能解决你的问题,请参考以下文章

JS的运算符

python 第11课 布尔值 比较运算符 逻辑运算符 短路问题

python 第11课 布尔值 比较运算符 逻辑运算符 短路问题

逻辑运算符短路与,短路或

Python入门-2编程基本概念:11布尔值-比较运算符-逻辑运算符及短路问题

20161115课堂笔记