什么是更有效,按位或相等检查?

时间:2016-11-10 10:00:55

标签: c# performance bit-manipulation

我只是编写了一些条件变量,并认为将值设置为2个布尔值之间的相等结果会更容易。

处理方面哪些更快/更有效,显然这是微不足道的?

bool output = true&true;

bool output = true&&true;

我希望后者作为单一的等式检查,而不是计算整个字节

先前对模糊性表示感谢和道歉。从Robbas的回答中,如果代码类似于:

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

明显的改进是将前两行放入声明中意味着当值为false时,您将比按位检查或预设值更有效。特别是当逻辑有强化方法时。

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

即使这样做,也要先按要求最低的要求对支票进行排序。

3 个答案:

答案 0 :(得分:1)

如果您有任何疑问,请对其进行分析。但在您的特定情况下,这些都是编译时可评估的常量表达式,编译器会将它们优化为相同的结果bool output = true;

一般来说,&的两个参数都需要进行评估,而对于&&,第二个参数仅在第一个参数为false时进行评估。对于更复杂的表达式,差异可能很大。

您还应注意,即使a & bfalse分别评估为ab 也可以<{1}} true 。以a = 0b01b = 0b10为例。

答案 1 :(得分:1)

在您的假设示例中,我非常怀疑评估true是否疯狂(如果没有完全编译),这很重要

但是举个例子:

bool output = veryLongFunction() & otherVeryLongFunction();

VS

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

在这种情况下,双&amp;&amp;如果第一个计算结果为false,则表达式短路,因此比仅使用一个&amp;。

更快

答案 2 :(得分:0)

取决于第二个参数。自console.log构建

以来
&&

将编译成(伪代码)

 bool output = left && right; 

如果 if (left != 0) // JZ or JNZ assembly instruction output = right else output = 0; leftfalse根本不进行计算,right是否耗时且right为{{} 1}}经常足够left是一个更有效的解决方案。

相反,当false&&都只是left值,而随机时,CPU分支预测符将被合并,条件

right
通常会预测错误,它会导致boolean滴答惩罚。对于 if (left != 0) ,它将被编译为一个5-30left & right汇编指令(AND tick)。