C#,在for..loop中声明一个变量,会降低性能吗?

时间:2011-10-25 02:33:01

标签: c# variables

例如:

            for (i = 0; i < 100; i++)
            {
               string myvar = "";
                // Some logic
            }

是否会使性能或内存泄漏?

为什么我这样做,因为我不想在for..loop之外访问“myvar”。

这是任何性能监视器,我可以比较两个片段或整个程序之间的执行时间吗?

谢谢你。

8 个答案:

答案 0 :(得分:13)

不,变量纯粹是为了程序员的方便。在哪里声明它们并不重要。有关详细信息,请参阅my answer to this duplicate question

答案 1 :(得分:2)

也许你可以查看我曾经做过的关于另一个对话的旧测试。 Variable declaration. Optimized way

结果证明重新定义更快,但内存却不那么容易。

我的简单测试。我初始化了一个对象100,000,000次,创建一个新对象显然更快,而不是重新使用旧对象:O

    string output = "";
    {
        DateTime startTime1 = DateTime.Now;
        myclass cls = new myclass();
        for (int i = 0; i < 100000000; i++)
        {
            cls = new myclass();
            cls.var1 = 1;
        }
        TimeSpan span1 = DateTime.Now - startTime1;
        output += span1.ToString();
    }

    {
        DateTime startTime2 = DateTime.Now;
        for (int i = 0; i < 100000000; i++)
        {
            myclass cls = new myclass();
            cls.var1 = 1;
        }
        TimeSpan span2 = DateTime.Now - startTime2;
        output += Environment.NewLine + span2.ToString() ;
    }
    //Span1 took 00:00:02.0391166
    //Span2 took 00:00:01.9331106

public class myclass
{
    public int var1 = 0;
    public myclass()
    {
    }
}

答案 2 :(得分:0)

更新:

如果您使用与循环相同类型的变量,则可以执行我最初提取的操作:

for (int  i = 0,  myvar = 0; i < 100; i++) {
    //some logic
}

否则不要像其他人已经建议的那样担心

@phoog,thx用于检查答案

答案 3 :(得分:0)

我相信这会是一个性能问题。由于VM需要分配内存来存储每个循环对String的引用。即使引用可能是同一个String实例,每次循环时分配内存也不是优选的。

答案 4 :(得分:0)

提供一个真实的例子:

我刚刚编写了一个.obj模型加载器,当然,它包含一些嵌套循环。 我在循环之上声明了所有变量,但后来我开始想知道与OP相同的东西并找到了这个线程。所以我尝试将所有变量声明移动到我的循环中的第一个点,在那里我使用它们并且实际上看到了一个小的性能增益。以前平均加载380毫秒(实际为370-400毫秒)的模型现在可以更快地加载大约15-20毫秒。这只是5%左右,但仍然有所改善。

我的循环结构只包含一个foreach循环和一个嵌套的for循环,但也包含很多if语句。我移动了5个变量声明,其中大多数是字符串和整数的数组。

答案 5 :(得分:-1)

是的,这会造成内存使用问题。我不相信它会导致内存泄漏,因为垃圾收集器最终会收集未使用的对象,但这会对应用程序的性能产生负面影响。

我建议你使用在for循环范围之外声明的字符串构建器。

答案 6 :(得分:-1)

它不会完全降低性能或导致内存泄漏,但它仍然需要谨慎。

字符串是不可变的,这意味着一旦创建,它们就无法更改。通过在循环内创建一个新字符串,您至少要创建 n 字符串变量。如果您尝试在循环内进行字符串操作,则应考虑使用StringBuilder代替。

答案 7 :(得分:-1)

除非编译器以某种方式优化您的代码,否则在for循环中声明变量将需要分配新变量和旧变量的集合。话虽这么说,编译器在优化代码方面做得非常好。

如果您想快速测试两种情况,请使用StopWatch类来衡量执行每种情况所需的时间。我的猜测是,这种差异将不存在,可以忽略不计。