2016-11-10 73 views
2

我只是写了几个条件变量,并认为将值设置为2个布尔值之间相等的结果会更容易。什么是更高效,按位或平等检查?

处理方面会更快/更有效率,显然这是边缘?

bool output = true&true; 

bool output = true&&true; 

我期望而不是先前计算整个字节


感谢和道歉上的模糊性后者作为其一个单一的相等性检查。从Robbas答案,如果代码是类似于:

bool input1 = GenerateFirstValue(); 
bool input2 = GenerateSecondValue(); 
bool output = input1 && input2; 

明显改善是第2行放到声明将意味着当值为false你会在按位检查更有效,或预置值。特别是当逻辑具有密集方法时。

bool output = GenerateFirstValue() && GenerateSecondValue(); 

即使这样做,按照要求最低的第一次对支票进行排序。

+4

[哪个更快?](https://ericlippert.com/2012/12/17/performance-rant/) –

+2

如果**这**是应用程序中的性能瓶颈,*恭喜*。而且,如果它是瓶颈,那么尝试两者并衡量它似乎是微不足道的。 –

+1

它们在运行时都会完全相同,因为它们是编译器将评估的常量表达式。这就是为什么这个问题只能由你在真实场景中回答。 –

回答

1

在假想的例子中,我很怀疑它的事项作为评估true是快疯了(如果没有编译完全消失)

拿这个例子但是:

bool output = veryLongFunction() & otherVeryLongFunction(); 

VS

bool output = veryLongFunction() && otherVeryLongFunction(); 

在这种情况下,如果第一次计算结果为f,则双重表达式将表达式短路因此比仅使用一个&更快。

+0

我的例子本来是一个简化版本。如果第一次检查失败,我不认为这个等式没有处理第二次检查。谢谢。 –

1

如果你有任何疑问,然后配置文件。但是,在特定情况下,这些都是编译时评估常量表达式,编译器将优化他们两个相同的结果bool output = true;

虽然在一般的&两个参数需要进行评估,而对于&&第二个参数是唯一评估如果第一个是false。对于更复杂的表达式,差异可能很大。

你也应该注意,通常a & b可能false即使ab分别评估为true。以a = 0b01b = 0b10为例。

0

取决于第二的说法。由于&&建设

bool output = left && right; 

会被编译成(伪)

if (left != 0) // JZ or JNZ assembly instruction 
    output = right 
else 
    output = 0; 

的情况下leftfalseright完全不计算,如果right是耗时且leftfalse往往不够那么&&是一个更有效的解决方案。

相反,当两个leftright只是boolean值,但随机那些所以CPU的分支预测将共熔和条件

if (left != 0) 

往往会预测,它将导致5-30滴答罚款。至于left & right,它将被编译成一个ANDMUL汇编指令(1/3-1勾号)。