有两个合乎逻辑的条件:
A. ( Ls != Ec && Ls != Uc && Ls != Rfc )
B. (!(Ls==Ec || Ls == Uc || Ls == Rfc))
变量是Ls,Ec,Uc,Rfc(整数)
我发现这两个条件在逻辑上是相同的。
我的问题是(是!):
是否有任何在线工具/网络可以检查多个/两个逻辑条件? 并且性能更好,通常更好或与C#.NET 3.5相关
感谢。
答案 0 :(得分:2)
我知道没有在线的任何内容,但学习和应用De Morgan's Laws和Truth Tables会让你在那里yoruself。
答案 1 :(得分:2)
C#编译器似乎为两个代码生成相同的IL(包括调试和发布版本)。因此,两者之间必须没有性能差异。
事实上,根据IL,C#编译器将TestTwo转换为TestOne。当你在Reflector中看到编译好的dll时,TestTwo就变成了TestOne。
我编译了以下代码并在ILDASM中打开它们。
public bool TestOne(int l, int e, int u, int r)
{
return (l != e && l != u && l != r);
}
public bool TestTwo(int l, int e, int u, int r)
{
return (!(l == e || l == u || l == r));
}
以下是我在ILDASM中看到的内容(基于发布版本)。
.method public hidebysig instance bool TestOne(int32 l,
int32 e,
int32 u,
int32 r) cil managed
{
// Code size 19 (0x13)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: beq.s IL_0011
IL_0004: ldarg.1
IL_0005: ldarg.3
IL_0006: beq.s IL_0011
IL_0008: ldarg.1
IL_0009: ldarg.s r
IL_000b: ceq
IL_000d: ldc.i4.0
IL_000e: ceq
IL_0010: ret
IL_0011: ldc.i4.0
IL_0012: ret
} // end of method Program::TestOne
.method public hidebysig instance bool TestTwo(int32 l,
int32 e,
int32 u,
int32 r) cil managed
{
// Code size 19 (0x13)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: beq.s IL_0011
IL_0004: ldarg.1
IL_0005: ldarg.3
IL_0006: beq.s IL_0011
IL_0008: ldarg.1
IL_0009: ldarg.s r
IL_000b: ceq
IL_000d: ldc.i4.0
IL_000e: ceq
IL_0010: ret
IL_0011: ldc.i4.0
IL_0012: ret
} // end of method Program::TestTwo
我使用VS2008 sp1(.NET 3.5 sp1)来测试此代码。
答案 2 :(得分:1)
有一种说法“首先让它发挥作用,然后让它快速!”。我认为两个版本之间的差异(如果存在的话)不会影响应用程序的整体性能 - 至少在所有应用程序的99.99%。如果您的应用程序是剩余的0.001%之一,那么您正在编写非常特殊和复杂的高速软件。在这种情况下,您不应该使用理论工具。在真实的现场条件下测量它!
答案 3 :(得分:0)
我认为这取决于实施......
在基于.Net的平台上,从我记忆中,当使用&&运算符,表达式从左到右进行求值,如果左操作数为false,则不对右边的操作数进行求值。按照这种逻辑,我觉得选项A将是一个选择的选项,并且如果其中一个最左边的操作数变为假,则会更快。我想这可能就是为什么IL生成更喜欢使用TestOne方法的原因(顺便说一下,推荐选择路径的好主意,谢谢Chansik Im。