2011-04-13 130 views
2

有两个逻辑条件:比较逻辑条件

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

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

变量是LS,EC,UC,RFC(整数)

我发现,这两个条件在逻辑上是一样的。

我的问题/ s是(有!):

是否有任何在线工具/网络检查多个/两个逻辑条件? 而性能明智哪一个更好一般或与C#.NET 3.5相关

谢谢。

+0

您已经发现了De Morgan的定理http:// en .wikipedia.org/wiki/ Demorgan%27s_theorem – IanGilham 2011-04-13 16:10:09

+0

@Everyone我知道它的愚蠢问题,也没有制作任何高端应用程序,但只是想知道任何性能差异存在与否 – Pratik 2011-04-13 16:14:34

回答

2

什么在线,我知道,但学习和应用De Morgan's LawsTruth Tables会让你在那里yoruself。

+0

很好,谢谢。&在性能方面两者都不会有丝毫差异?对吗? – Pratik 2011-04-13 16:11:58

+0

@Rahul Joshi - 如果对不同条件没有副作用,短路可能会对性能产生非常轻微的影响。 – Oded 2011-04-13 16:13:45

1

有句话说“先让它工作,然后快点!”。我假设两个版本之间的差异(如果存在的话)不会影响应用程序的整体性能 - 至少在99.99%的所有应用程序中。如果你的应用程序是其余的0.001%,那么你正在编写非常特殊和复杂的高速软件。在这种情况下,你不应该使用理论工具。在真实的现场条件下测量!

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)来测试这段代码。

0

我相信这是依赖于实现...
在基于.Net平台,从我记得,使用& &操作时,表达被从左向右计算的,如果左操作数是假的,正确的一个甚至没有评估。按照这个逻辑,我觉得选项A是一个选择的选项,如果其中一个最左边的操作数变成错误的话,选项A会更快。我想这可能是为什么IL生成更倾向于使用TestOne方法(顺便提一下,很好的想法推断出什么是选择的路径,谢谢Chansik Im。