2010-08-04 29 views
5

在C#中,比较以下THREE替代方案时性能是否会有差异?会在子块内声明变量提高性能吗?

ONE

void ONE(int x) { 

if (x == 10) 
{ 
    int y = 20; 
    int z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

void TWO(int x) { 

int y; 
int z; 

if (x == 10) 
{ 
    y = 20; 
    z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

void THREE(int x) { 

int y = 20; 
int z = 30; 

if (x == 10) 
{ 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 
+3

你正在担心被称为“微观优化”的问题:你有没有基准确定你确实存在性能问题? – 2010-08-04 03:18:59

+0

@Mitch:我在克雷格的帖子中看不到任何地方抱怨他的代码性能下降。他有一个完全有效和聪明的问题要问,所以他做到了。这就像我们不能发布任何涉及性能的@SO。 – 2010-08-04 03:41:21

+2

我甚至不会将这种微型优化称为纳米优化。任何看过探查器输出的人都知道,担心存储变量或调用函数所花的时间可以忽略不计。 – 2010-08-04 03:46:06

回答

4

所有其他条件相同(他们通常都没有,这就是为什么你通常要实际测试它),ONE()TWO()因为局部变量最终作用域是应该产生相同的IL指令整个方法。 THREE()将是可忽略如果x==10较慢,因为其他两个不会费心地存储在局部变量的值。

所有三个都占用相同数量的内存 - 即使没有存储任何变量,也会分配所有变量的内存。 JIT编译器可以在这里执行优化,但是,如果它查找未使用的变量。

+0

+1和1生成相同的IL。 C#/ CLR中的方法级别范围是一种狡猾的行为,特别是对于C++程序员。 – 2010-08-04 03:47:55

+0

当x!= 10时编译器仍然会在选项ONE中分配内存吗? – CJ7 2010-08-04 05:24:03

+0

@Craig,是的,它会 - 因为没有办法知道x!= 10,直到在函数调用设置完成后(包括为变量分配内存)对它进行实际评估。 – 2010-08-04 23:24:18

1

有没有性能上的差异,但你去以找出每个示例之间的变量范围问题。

你也呈现出这些例子之间的三个不同的意图,这是不是你想要的东西:

  1. y和z被限制在if语句的范围。

  2. y和z在if语句之外使用,但是有条件地设置。

  3. y和z与if语句无关。

+0

为什么没有性能差异? – CJ7 2010-08-04 03:58:06

0

我认为这不会有太大的区别。唯一需要担心的是如果创建新对象并初始化它很昂贵。您总是可以尝试对每种方法进行几千次简介,看看是否有任何差异,但我怀疑您会找到任何差异。

我只将声明从使用位置移开的唯一时间是它是否会在循环中进行处理。例如:

void RunMethod() { 
    FormRepresentation formRep = null; 
    for (int idx = 0; idx < 10; idx++) { 
    formRep = new FormRepresentation(); 
    // do something 
    } 
} 

它实际上没有什么区别,因为对象仍在创建中,但对我而言,它看起来更干净。您需要考虑的另一件事是变量的范围。声明的变量不能用于他们声明的范围之外。

1

当然,你应该总是选择ONE,它更可读。速度提高几纳秒不是偶然,通常是可读的代码。