我需要在SECOND下运行此forloop而不做任何更改 整个循环和forloop。
var someLongDataString = "";
const int sLen = 30, loops = 50000;
var source = new string('X', sLen);
Console.WriteLine();
for (var i = 0; i < loops; i++)
{
someLongDataString += source;
}
编辑:该限制不适用于someLongDataString += source;
答案 0 :(得分:2)
正如我在评论中指出的那样,它意味着对循环中语句的更改。
您的代码:
此代码:
class Program
{
static void Main(string[] args)
{
var someLongDataString = "";
var builder = new StringBuilder(); // <---- use a StringBuilder instead
const int sLen = 30, loops = 50000;
var source = new string('X', sLen);
var stopwatch = Stopwatch.StartNew();
Console.WriteLine();
for (var i = 0; i < loops; i++)
{
//someLongDataString += source;
builder.Append(source);
}
someLongDataString = builder.ToString();
Console.WriteLine("Elapsed: {0}", stopwatch.Elapsed);
Console.WriteLine("Press any key");
Console.ReadLine();
}
}
之后:
在创建新对象时,执行对字符串的大量连接非常低效,请记住string
不可变。 StringBuilder
不是,另外,使用预先分配的缓冲区来容纳潜在的添加。因此,它不是为每个调用分配,而是仅在填充后重构它的缓冲区。
MSDN可以在StringBuilder
上说明这一点:
对于执行大量字符串操作的例程(,例如在循环中多次修改字符串的应用程序),重复修改字符串可以确定显着的性能损失。另一种方法是使用StringBuilder,它是一个可变的字符串类。可变性意味着一旦创建了类的实例,就可以通过追加,删除,替换或插入字符来修改它。 StringBuilder对象维护缓冲区以适应字符串的扩展。如果房间可用,则将新数据附加到缓冲区;否则,分配一个新的较大缓冲区,将原始缓冲区中的数据复制到新缓冲区,然后将新数据附加到新缓冲区。 MSDN
特别注意:
虽然StringBuilder类通常提供比String类更好的性能,但只要你想操作字符串,就不应该自动用StringBuilder替换String 。效果取决于字符串的大小,为新字符串分配的内存的数量,应用程序执行的系统 ,以及类型的操作。您应该准备测试您的应用程序,以确定StringBuilder是否实际上提供了显着的性能改进。 MSDN
答案 1 :(得分:1)
一种方法是使用字符串构建器。但这需要在forloop中进行更改
var starttime = DateTime.Now;
var someLongDataString = new StringBuilder(100000);
const int sLen = 30, loops = 50000;
var source = new string('X', sLen);
Console.WriteLine();
for (var i = 0; i < loops; i++)
{
someLongDataString.Append(source);
}
Console.WriteLine((DateTime.Now - starttime).Milliseconds);
Console.ReadLine();