比较逻辑条件

时间:2011-04-13 16:06:08

标签: c# .net performance comparison logic

有两个合乎逻辑的条件:

A. ( Ls != Ec && Ls != Uc && Ls != Rfc )

B. (!(Ls==Ec || Ls == Uc || Ls == Rfc))

变量是Ls,Ec,Uc,Rfc(整数)

我发现这两个条件在逻辑上是相同的。

我的问题是(是!):

是否有任何在线工具/网络可以检查多个/两个逻辑条件? 并且性能更好,通常更好或与C#.NET 3.5相关

感谢。

4 个答案:

答案 0 :(得分:2)

我知道没有在线的任何内容,但学习和应用De Morgan's LawsTruth 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。