C# 比较逻辑条件

C# 比较逻辑条件,c#,.net,performance,comparison,logic,C#,.net,Performance,Comparison,Logic,有两个逻辑条件: A. ( Ls != Ec && Ls != Uc && Ls != Rfc ) B. (!(Ls==Ec || Ls == Uc || Ls == Rfc)) 变量是Ls、Ec、Uc、Rfc整数 我发现这两个条件在逻辑上是相同的 我的问题是!: 是否有在线工具/网络来检查多个/两个逻辑条件? 性能方面,一般来说哪个更好,或者与C.NET3.5相比更好 谢谢。我在网上什么都不知道,只知道学习和应用,它会让你自己去那里。有句谚语说,先让它工作起

有两个逻辑条件:

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

B. (!(Ls==Ec || Ls == Uc || Ls == Rfc))
变量是Ls、Ec、Uc、Rfc整数

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

我的问题是!:

是否有在线工具/网络来检查多个/两个逻辑条件? 性能方面,一般来说哪个更好,或者与C.NET3.5相比更好


谢谢。

我在网上什么都不知道,只知道学习和应用,它会让你自己去那里。

有句谚语说,先让它工作起来,然后让它快点!。我假设两个版本之间存在的差异不会影响应用程序的整体性能,至少在99.99%的应用程序中是如此。如果您的应用程序是剩下的0.001%之一,那么您正在编写非常特殊和复杂的高速软件。在这种情况下,你不应该使用理论工具。在真实的生活条件下测量它

C编译器似乎为调试和发布版本生成的两个代码生成了相同的IL。因此,两者之间必须没有性能差异

事实上,根据IL,C编译器将Test2转换为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

我使用VS2008SP1.NET3.5SP1来测试这段代码

我相信这取决于实现……在基于.Net的平台上,根据我的记忆,当使用&&运算符时,表达式从左到右求值,如果左操作数为false,则右操作数甚至不求值。按照这种逻辑,我觉得选项A将是一个被选中的选项,如果那些最左边的操作数中的一个被证明是错误的,那么它会更快。我想这可能是IL-generated更喜欢使用TestOne方法的原因,顺便说一句,推断所选路径的好主意,谢谢Chansik Im。

你已经发现了De Morgan定理@Everyone I know这是一个愚蠢的问题&我也没有制作任何高端应用程序,只是想知道是否存在性能差异?很好,谢谢就性能而言,两者甚至不会有丝毫差异??是吗?@Rahul Joshi-如果在不同的条件下没有副作用,短路可能会对性能产生非常轻微的影响。