这是什么意思:
foreach(Type item in myCollection)
{
StringBuilder sb = new StringBuilder();
}
比起其他的方法要慢得多:
StringBuilder sb = new StringBuilder();
foreach(Type item in myCollection)
{
sb = new StringBuilder();
}
换句话说,我在哪里声明StringBuilder
真的很重要吗?
这是什么意思:
foreach(Type item in myCollection)
{
StringBuilder sb = new StringBuilder();
}
比起其他的方法要慢得多:
StringBuilder sb = new StringBuilder();
foreach(Type item in myCollection)
{
sb = new StringBuilder();
}
换句话说,我在哪里声明StringBuilder
真的很重要吗?
不会影响性能,不管你在哪里声明它。
为了代码整洁性,在使用它的最内层范围内声明它,例如你的第一个例子。
如果你这样写,可能会提高一些性能:
StringBuilder sb = new StringBuilder();
foreach(Type item in myCollection)
{
sb.Length = 0;
}
所以你需要在循环外实例化StringBuilder一次,并在循环中重置大小,这比实例化新对象略快。
ToString
时,它会复制缓冲区。如果有理由认为它对性能敏感,我会进行基准测试。 - Steven Sudit这里的代码不足以清楚地表明在您的特定情况下性能差异。尽管如此,在大多数情况下,像这样在循环内部声明引用变量与在外部声明之间的差异微不足道。
StringBuilder
实例。与应用程序的其余部分相比,这对性能的影响基本上是微不足道的。最好的方法是在循环中尝试这两种方法,每个循环大约100,000次。测量每个100,000次迭代所需的时间并进行比较。我认为差别不大。
但是,确实存在一些小差异。第一个示例将具有与迭代次数相同的变量数量。第二个示例只有一个变量。编译器足够聪明,在这里进行了一些优化,因此您不会注意到速度提高。
但是,如果您不想在再次离开循环后使用循环内生成的最后一个对象,则第一种解决方案更好。在第二个解决方案中,垃圾收集器需要一段时间才能释放最后创建的对象。在第一个示例中,垃圾收集器将更快地释放对象。它取决于其余的代码,但是如果您在此StringBuilder对象中存储了大量数据,则第二个示例可能会长时间保留此内存,从而降低代码离开循环后的性能!
另一方面,如果对象占用了100 KB,并且您的计算机有16 GB,那么没有人关心...垃圾收集器最终会再次释放它,可能是在包含此循环的方法离开时。