许多不必要的变量会导致C#中的性能问题吗?

时间:2012-01-26 13:15:39

标签: c# performance c#-4.0

我有一个C#4.0应用程序,在这个应用程序中我有很多不必要的变量。与下面代码中的_foo变量类似:

public string Foo() { 
    var _foo = "foo bar";
    return _foo;
}

正如我所提到的,像这样的情况发生在很多方法中。

很多不必要的变量(比如我在本例中解释的那些)会导致C#中的性能问题吗?

修改

如果我要删除它们,我不会问任何建议。我的问题是性能效应。事实上,该应用程序不是由我编写的,我是这个项目的新手。我刚看到并想知道它是否有任何性能。除了它对代码质量有影响这一事实之外的效果。

3 个答案:

答案 0 :(得分:25)

  

会有很多不必要的变量(就像我在这里解释的那样)   case)导致C#中的性能问题?

不,他们不会。

在Release模式下编译并优化代码时,编译器足够智能,可以删除所有不必要的东西:

public string Foo()
{
    return "foo bar";
}

或更准确地说:

.method public hidebysig instance string Foo() cil managed
{
    .maxstack 1
    .locals init (
        [0] string str)
    L_0000: ldstr "foo bar"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: ret 
}

与其调试模式相比,它完全不同:

.method public hidebysig instance string Foo() cil managed
{
    .maxstack 1
    .locals init (
        [0] string _foo,
        [1] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr "foo bar"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: stloc.1 
    L_0009: br.s L_000b
    L_000b: ldloc.1 
    L_000c: ret 
}

从性能的角度来看,绝对不是你应该担心的事情。您应该担心的是代码的可读性,这个优化的代码示例似乎比您的版本更具可读性。

因此,您可以信任不断改进的编译器,并能够优化这种情况。

答案 1 :(得分:1)

除非系统出现明显的性能问题,否则不应对性能进行编码/修改。作为软件开发人员,我们的第一个目标是编写干净,可读,优雅的代码。就像Darin所说,上面的编译器将代表我们完成机器执行优化工作。

答案 2 :(得分:0)

如果这是一个未使用的变量,它可能会导致降低性能并增加程序集的大小,因为它们会在运行时占用内存空间。

如需进一步阅读和参考,您可以查看:

https://msdn.microsoft.com/en-us/library/ms182278(v=vs.140).aspx