将在子块内声明变量可以提高性能吗?

时间:2010-08-04 03:14:13

标签: c# scope variable-declaration

在C#中,在比较以下三个替代方案时,性能会有任何差异吗?

ONE

void ONE(int x) {

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

TWO

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
}
}

4 个答案:

答案 0 :(得分:4)

所有其他条件相同(且它们通常不相同,这就是您通常必须实际测试它的原因),ONE()TWO()应生成相同的IL指令,因为局部变量最终作用于整个方法。如果THREE()x==10可忽略更慢,因为其他两个人不会费心将值存储在局部变量中。

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

答案 1 :(得分:1)

没有性能差异,但您将在每个示例之间找到可变范围问题。

您还会在这些示例之间显示三种不同的意图,这不是您想要的:

  1. y和z仅限于if语句的范围。

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

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

答案 2 :(得分:1)

当然,你应该总是选择一个,它更具可读性。它快一点几纳秒并不是偶然的,可读的代码往往是。

答案 3 :(得分:0)

我认为这不会有太大的影响。您唯一需要担心的是创建新对象并初始化它是昂贵的。您总是可以尝试将每种方法分析几千次以查看是否存在任何差异,但我怀疑您会发现任何差异。

我唯一一次将声明移到远离它使用的地方的时候就是如果它将在一个循环中进行处理。 e.g:

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

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