我想知道是否嵌套,如果是比AND语句更好。 我有一个循环,去了很多次,所以我想获得更快的执行。 下面是具有相同的逻辑与我的代码。 嵌套if语句是一个循环中。
for ( int i = 0; i < array.length; i++)
{
// do stuff
if (x == 5)
{
if (y == 3)
{
// do stuff
}
}
}
请问我的代码会更快被显著区别,如果我替换的嵌套,如果这个和语句?
if ((x == 5) && (y == 3))
// do stuff
我看了这个链接 ,但我没有找到答案。 我是一名学生,还在学习,感谢所有的反馈!
.NET将停止检查,如果有条件的第一部分是假的,所以会有两者之间没有性能差异。
不,这不会对性能有显著差异, 但也有可能是可读性差。
这两个会产生相同的IL
当与优化/释放(与LINQPad测试)编译:
IL_0000: ldc.i4.5
IL_0001: stloc.0
IL_0002: ldc.i4.s 0A
IL_0004: stloc.1
IL_0005: ldloc.0
IL_0006: ldc.i4.5
IL_0007: bne.un.s IL_000D
IL_0009: ldloc.1
IL_000A: ldc.i4.3
IL_000B: pop
即使没有优化的差距并不显著:
嵌套的语句:
IL_0001: ldc.i4.5
IL_0002: stloc.0
IL_0003: ldc.i4.s 0A
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldc.i4.5
IL_0008: ceq
IL_000A: ldc.i4.0
IL_000B: ceq
IL_000D: stloc.2
IL_000E: ldloc.2
IL_000F: brtrue.s IL_0020
IL_0011: nop
IL_0012: ldloc.1
IL_0013: ldc.i4.3
IL_0014: ceq
IL_0016: ldc.i4.0
IL_0017: ceq
IL_0019: stloc.2
IL_001A: ldloc.2
IL_001B: brtrue.s IL_001F
IL_001D: nop
IL_001E: nop
没有嵌套语句:
IL_0001: ldc.i4.5
IL_0002: stloc.0
IL_0003: ldc.i4.s 0A
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldc.i4.5
IL_0008: bne.un.s IL_0013
IL_000A: ldloc.1
IL_000B: ldc.i4.3
IL_000C: ceq
IL_000E: ldc.i4.0
IL_000F: ceq
IL_0011: br.s IL_0014
IL_0013: ldc.i4.1
IL_0014: nop
IL_0015: stloc.2
IL_0016: ldloc.2
IL_0017: brtrue.s IL_001B
IL_0019: nop
不,不会有任何两者之间的区别。 然而,并使行较少,更可读的(如果你没有那么多的条件)
在有些情况下的情况下if
s为更好,感觉更自然,一个常见的例子如下:
String s=//...
if(s==null)return;
if(s.Length > 0) //do something
随着AND,这可以被替换为:
if ((s!=null) && (s.Length > 0)) //Dosomething
许多开发商做这样的错误:
if ((s.Length > 0) && (s!=null) ) //Dosomething
这将在一个空引用异常结束
正如你所看到的,它是更自然的使用单独的时,首先想到做无效的检查if
小号
在编译的代码,没有任何理由的速度应该是不同的,他们将转化为完全一样的汇编代码。 我绝对同意关于可读性的因素,它会缩短你的类的长度为好。