C# 用于比较值类型的短路运算符的.Net性能?
如果我比较两种已知的值类型,我会从c中的C# 用于比较值类型的短路运算符的.Net性能?,c#,.net,optimization,conditional-statements,short-circuiting,C#,.net,Optimization,Conditional Statements,Short Circuiting,如果我比较两种已知的值类型,我会从c中的|或|操作符获得更好的性能吗 我的特定用例是类中的一个bool成员,表示过时的数据,由如下循环方法激活: private bool _stale; private HashSet<Foo> _foos; 我想我是在问短路运算符的开销是否足够,我不会用它来检查已分配的值类型…我会使用: 或: 该操作员是专门为此目的设计的,目的明确(并且很可能是性能最佳的,因为它是专门为此目的设计的) 至于实际性能,这种级别的微优化通常几乎不可能测量,因为性能上
|
或|
操作符获得更好的性能吗
我的特定用例是类中的一个bool
成员,表示过时的数据,由如下循环方法激活:
private bool _stale;
private HashSet<Foo> _foos;
我想我是在问短路运算符的开销是否足够,我不会用它来检查已分配的值类型…我会使用:
或:
该操作员是专门为此目的设计的,目的明确(并且很可能是性能最佳的,因为它是专门为此目的设计的)
至于实际性能,这种级别的微优化通常几乎不可能测量,因为性能上的任何差异都将远小于操作(HashSet.Add调用)上的差异,因此代码的清晰性更为重要。您可以构建一个测试来衡量这一点,但它不太可能在性能方面有足够大的差异
或:
该操作员是专门为此目的设计的,目的明确(并且很可能是性能最佳的,因为它是专门为此目的设计的)
至于实际性能,这种级别的微优化通常几乎不可能测量,因为性能上的任何差异都将远小于操作(HashSet.Add调用)上的差异,因此代码的清晰性更为重要。您可以构建一个测试来衡量这一点,但它不太可能在性能方面有足够大的差异,这很重要。我不清楚msdn。
.Add()
是否保证执行?@Matthew每次都会执行。我知道这是一个微观优化。。。但是我可以在不牺牲清晰度的情况下“最佳地”做到这一点,也不需要付出太多的努力,那么为什么不呢?@Matthew好吧,牺牲清晰度是这里的关键——在这种情况下,我认为我在这里的选择是最清晰的版本,这就是为什么我更喜欢它;)我完全同意,+1。。。我以前从未使用过这个操作符。msdn我不清楚。.Add()
是否保证执行?@Matthew每次都会执行。我知道这是一个微观优化。。。但是我可以在不牺牲清晰度的情况下“最佳地”做到这一点,也不需要付出太多的努力,那么为什么不呢?@Matthew好吧,牺牲清晰度是这里的关键——在这种情况下,我认为我在这里的选择是最清晰的版本,这就是为什么我更喜欢它;)我完全同意,+1。。。我以前从未使用过这个运算符。请双向编写代码。测量性能。否则你怎么知道这两件事中哪一件更快?@EricLippert你可能是少数几个不做测试就能知道的人之一……我向你保证这不是真的;如果我对性能分析有一点了解的话,那就是猜测两件事中哪一件更快是毫无意义的。测量性能。否则你怎么知道这两件事中哪一件更快?@EricLippert你可能是少数几个不做测试就能知道的人之一……我向你保证这不是真的;如果我对性能分析有一点了解的话,那就是猜测两件事情中哪一件更快是毫无意义的。
foreach (var foo in foos)
{
_stale = _foos.Add(foo) | _stale;
//Or is the following line better?
//_stale = _foos.Add(foo) || _stale;
}
_stale |= added;
_stale |= _foos.Add(foo);