如何在SECOND下运行Forloop而不改变循环

时间:2017-01-25 00:06:32

标签: c#

我需要在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;

2 个答案:

答案 0 :(得分:2)

正如我在评论中指出的那样,它意味着对循环中语句的更改。

您的代码:

enter image description here

此代码:

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();
    }
}

之后:

enter image description here

为什么这么快?

在创建新对象时,执行对字符串的大量连接非常低效,请记住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();