struct mydata
{
public int id;
public string data;
}
class Program
{
static void Main(string[] args)
{
List<mydata> myc = new List<mydata>();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000000; i++)
{
mydata d = new mydata();
d.id = i;
d.data = string.Format("DataValue {0}",i);
myc.Add(d);
}
stopwatch.Stop();
Console.WriteLine("End: {0}", stopwatch.ElapsedMilliseconds);
}
Почему этот код выше, так что МЕДЛЕННО ..?
На старом ноутбуке время:
Код C # выше: 1500мс
Подобный код в Delphi: 450ms ....
Затем я изменил код на KeyValue / Pair (см. Ниже):
</p>
<p>Stopwatch stopwatch = new Stopwatch();</p>
<pre><code> stopwatch.Start();
var list = new List<KeyValuePair<int , string>>();
for (int i = 0; i < 1000000; i++)
{
list.Add(new KeyValuePair<int,string>(i, "DataValue" + i));
}
stopwatch.Stop();
Console.WriteLine("End: {0}", stopwatch.ElapsedMilliseconds);
Console.ReadLine();
Это улучшило время до 1150 мс ..
Если я уберу '+ i', время будет <300 мс </p>
Если я попытаюсь заменить его на StringBuilder, время будет похожим.
</p>
<pre><code> StringBuilder sb = new StringBuilder();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
var list = new List<KeyValuePair<int, string>>();
for (int i = 0; i < 1000000; i++)
{
sb.Append("DataValue");
sb.Append(i);
list.Add(new KeyValuePair<int, string>(i, sb.ToString()));
sb.Clear();
}
stopWatch.Stop();
Console.WriteLine("End: {0}", stopWatch.ElapsedMilliseconds);
Console.ReadLine();
Немного лучше .. Если вы удалите sb.Append (i), это очень быстро ..
Может показаться, что каждый раз, когда вам нужно добавить Int к строке / строителю строк, это ОЧЕНЬ МЕДЛЕННО.
Могу ли я ускорить это каким-либо образом ??
РЕДАКТИРОВАТЬ **
Приведенный ниже код является самым быстрым, который я могу получить после внесения предложений:
</p>
<p>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;</p>
<p>namespace ConsoleApplication1
{
struct mydata
{
public int id;
public string data;
}</p>
<pre><code>class Program
{
static void Main(string[] args)
{
List<mydata> myc = new List<mydata>();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000000; i++)
{
mydata d = new mydata();
d.id = i;
d.data = "DataValue " + i.ToString();
myc.Add(d);
}
stopwatch.Stop();
Console.WriteLine("End: {0}", stopwatch.ElapsedMilliseconds);
Console.ReadLine();
}
}
}
Если я заменю строку:
<code>
d.data = "DataValue " + i.ToString();
с:
<code>
d.data = "DataValue ";
На моей домашней машине это составляет от 660 мс -> 31 мс ..
Да .. его на 630 мс медленнее с помощью '+ i.ToString ()'
Но все равно в 2 раза быстрее, чем boxing / string.format и т. Д.
Stopwatch stopwatch = new Stopwatch();</p>
<pre><code> stopwatch.Start();
var list = new List<KeyValuePair<int, string>>();
for (int i = 0; i < 1000000; i++)
{
list.Add(new KeyValuePair<int, string>(i, "DataValue" +i.ToString()));
}
stopwatch.Stop();
Console.WriteLine("End: {0}", stopwatch.ElapsedMilliseconds);
Console.ReadLine();
равно 612 мс .. (нет разницы в скорости, если List> (1000000); предварительно инициализирован).