2010-10-14 12 views
0

以下哪种会更快的静态方法称为数十亿次每纳秒:C#双有条件的性能

方法1:

static bool DualConditional(int value) 
{ 
    return A(value) && B(value); 
} 

方法2:

static bool DualConditional(int value) 
{ 
    if(!A(value) 
     return false; 

    if(!B(value) 
     return false; 
} 
+1

你真的能执行的方法“数十亿每纳秒时间”? – 2010-10-14 17:51:42

+1

没有丝毫的意义,这条线是有意的夸张。 – bufferz 2010-10-14 17:57:53

+5

你已经用两种方式编写代码,所以**试试看**。这是你可以得到一个值得信赖的答案的唯一方法,“哪个更快?”的问题。 – 2010-10-14 19:25:16

回答

7

它们应该是相同的。

首先会短路并返回,如果A()为假。

第一个也是更容易阅读和理解。即使性能稍差,我也会使用此代码。在牺牲可读性时,过早的微型优化是毫无价值的。

+0

谢谢你的澄清!这是后成熟,绝望优化:d – bufferz 2010-10-14 17:58:37

2

&&短路,这意味着右侧如果左侧通过时,在这种情况下只进行评价。所以,是的,

return A(value) && B(value);

if (A(value)) 
    if (B(value)) 
    return true; 

return false; 
2

粗糙quivalent C#编译器会变成方法1到 方法2自动

没有

并跳过B()如果A()为假?

一般情况下,像

return A(value) && B(value); 

代码快于

if(!A(value) 
    return false; 

if(!B(value) 
    return false; 

因为第一个变体可以被转换为不使用跳跃x86代码。

例如,在代码:

private static bool B_1(int value) 
    { 
     return value < 5; 
    } 

    private static bool B_2(int value) 
    { 
     if (value < 5) 
      return true; 
     else 
      return false; 
    } 

对于B_1 C#生成比B_2稍快x86代码。

在这种特定情况下我会说,这取决于A()和B()。我会在profiler下运行它,看看哪个更快。

+0

感谢除了别人写了上面添加细节。任何对64位运行时的洞察力? – bufferz 2010-10-14 18:00:20

+1

对于x64也是如此。我刚刚检查过。第一个B_1版本保存一个条件跳转。所以它快一点。 – Max 2010-10-14 19:43:37