Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,哪个'if'语句更快?_C#_Performance_Bit Manipulation - Fatal编程技术网

在C#中,哪个'if'语句更快?

在C#中,哪个'if'语句更快?,c#,performance,bit-manipulation,C#,Performance,Bit Manipulation,在以下条件下,如果语句更快,则选择哪个。似乎短路会编译成比非短路更多的指令 bool force = false; bool _isLoadingActual = true; bool _isLoadingLoadCore = true; int a = 0, b = 0; if (force | !(_isLoadingActual | _isLoadingLoadCore)) { a = 1; } if (force || !(_isLoadingActual || _isLo

在以下条件下,如果语句更快,则选择哪个
。似乎短路会编译成比非短路更多的指令

bool force = false;
bool _isLoadingActual = true;
bool _isLoadingLoadCore = true;

int a = 0, b = 0;

if (force | !(_isLoadingActual | _isLoadingLoadCore))
{
    a = 1;
}

if (force || !(_isLoadingActual || _isLoadingLoadCore))
{
    b = 1;
}

我认为第二个代码越快

if (force || !(_isLoadingActual || _isLoadingLoadCore))
{
    b = 1;
}
因为这是一个好主意


在上面的代码中,如果
force
为true,则无需检查静止条件(
!(_isLoadingActual | | _isLoadingLoadCore)

以下是最快的解决方案

a = 0;
b = 0;
因为您已经知道布尔变量的值

不,说真的。。第二个可能更快,因为它可能短路,也就是说,如果您没有将第一个布尔值硬编码为false!否则,短路似乎必须更快。

假设您的问题是“哪一个
|
短路”:

  • | |
    是否短路-

    如果第一个操作数的计算结果为false,则第二个运算符将确定OR表达式作为一个整体的计算结果是true还是false

  • |
    不会短路-

    对于布尔操作数,|计算其操作数的逻辑OR;也就是说,当且仅当其两个操作数都为false时,结果为false

所以在纯理论意义上,使用
|
的代码会更快,而且很可能无法测量实际代码中差异的影响


请注意,如果操作数的计算有副作用,则这两个语句并不等价(这不是您的情况,因为您已经有bool变量).

为什么不直接测试一下呢?@AMissico如果你运行了代码,你就不会有任何问题了。@AMissico通过测量1000次的时间来完成它。@AMissico你认为谁知道哪一个更快?您必须比较执行时间。@AMissico StackOverflow的精神不是做您不想做的事情,而是为您自己找不到的问题找到解决方案。如果编译器必须为短路生成条件,该怎么办?有关“分支错误预测”的更多信息,请参阅。一句话:如果这三个操作数都已经是布尔值(而不是返回布尔值的方法),则短路计算速度较慢,因为存在多个分支(
If(force){}else{If(…)…
).如果我没弄错,
a
&
b
将等于
0
…是的,我错了,我意识到If语句的计算结果为false,但我混淆了他指定的值..有点离题了..但谢谢我需要解决这个问题Hehe,没问题。我想我会发疯的>>假设你的问题是“哪一个|或| |短路”:当在两个布尔上使用时,
不是按位运算符,它是一个非短路循环布尔运算符。@AMissico,在C中没有为布尔类型定义“按位或”-检查链接(我还内联了主要部分)-它不是“按位或”表示
bool
,而是“非短路或”“.对于布尔值而言,它不是逻辑的还是与按位相同的?@AMissico,在某种程度上是-假设为单位值。但由于它没有明确定义为“按位”编译器/JIT可以自由地使用与常规”或“如有必要”相同的代码。因此,这两个语句之间唯一的真正区别是if second”或需要为结果评估正确的参数。