在子块内声明变量会提高性能吗?
-
25-09-2019 - |
题
在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编译器可以在这里进行的优化,不过,如果它曾经查找未使用的变量。
其他提示
没有性能差异,但您会发现每个示例之间存在变量范围问题。
您还在这些示例之间展示了三种不同的意图,这不是您想要的:
y 和 z 仅限于 if 语句的范围。
y 和 z 在 if 语句之外使用,但是是有条件设置的。
y 和 z 与 if 语句无关。
当然,你应该的总是的挑人,它更具有可读性。它是由一纳秒的一小部分更快不是偶然的,可读的代码通常是
我不认为它会带来多大的改变。你需要担心的唯一情况是如果在创建新的对象并初始化它是昂贵的。你总是可以尝试分析每种方法几千次,看看是否有任何差异,但我怀疑你会发现任何。
我谨声明远离它的使用,唯一的一次是,如果它要在一个循环中的工作。 e.g:
void RunMethod() {
FormRepresentation formRep = null;
for (int idx = 0; idx < 10; idx++) {
formRep = new FormRepresentation();
// do something
}
}
实际上它并不做任何差别,因为仍然正在创建的对象,但是,对我来说,它看起来更干净。你需要考虑的另一件事是变量的范围。声明的变量不能在它们被声明的范围之外使用。
不隶属于 StackOverflow