5

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

4 回答 4

4

其他一切都是平等的(而且它们通常不是,这就是为什么您通常必须实际测试它的原因),ONE()并且TWO()应该生成相同的 IL 指令,因为局部变量最终会作用于整个方法。如果其他两个不会费心将值存储在局部变量中,则速度THREE()将可以忽略不计。x==10

这三个都占用相同数量的内存——所有变量的内存都被分配,即使它们没有存储任何东西。但是,如果 JIT 编译器曾经寻找未使用的变量,它可能会在此处执行优化。

于 2010-08-04T03:20:18.187 回答
1

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

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

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

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

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

于 2010-08-04T03:19:48.310 回答
1

当然,您应该始终选择 ONE,它更具可读性。它快了几分之一纳秒并不是偶然的,可读的代码通常是。

于 2010-08-04T03:38:31.360 回答
0

我认为这不会有太大的不同。您唯一需要担心的是创建新对象并对其进行初始化是否代价高昂。您总是可以尝试对每种方法进行数千次分析,以查看是否有任何差异,但我怀疑您会发现任何差异。

我唯一一次将声明移离它使用的地方是它是否会在循环中处理。例如:

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

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

于 2010-08-04T03:21:44.423 回答