例如:
for (i = 0; i < 100; i++)
{
string myvar = "";
// Some logic
}
是否会使性能或内存泄漏?
为什么我这样做,因为我不想在for..loop之外访问“myvar”。
这是任何性能监视器,我可以比较两个片段或整个程序之间的执行时间吗?
谢谢你。
答案 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类来衡量执行每种情况所需的时间。我的猜测是,这种差异将不存在,可以忽略不计。