在C#中,比较以下内容时性能是否有差异 备择方案?

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
}
}
有帮助吗?

解决方案

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

这三个占用内存,内存相同数量的所有变量分配,即使没有存储在其中。 JIT编译器可以在这里进行的优化,不过,如果它曾经查找未使用的变量。

其他提示

没有性能差异,但您会发现每个示例之间存在变量范围问题。

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

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

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

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

当然,你应该的总是的挑人,它更具有可读性。它是由一纳秒的一小部分更快不是偶然的,可读的代码通常是

我不认为它会带来多大的改变。你需要担心的唯一情况是如果在创建新的对象并初始化它是昂贵的。你总是可以尝试分析每种方法几千次,看看是否有任何差异,但我怀疑你会发现任何。

我谨声明远离它的使用,唯一的一次是,如果它要在一个循环中的工作。 e.g:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top