Но можно попробовать проверить идею Алексея. У меня по 512 КБ на каждое из 2 ядер. Так что можно посмотреть прирост производительности при условии, что строка будет занимать 512 КБ, а не 8 МБ.
Алексей идею Алексея уже проверил :-) . Слегка модифицировав исходник (красным выделены изменения, класс ArrayString остался без изменений):
class Program
{
static void Main (string[] args)
{
for (int size=100000; size<=1000000; size+=100000)
{
ArrayString x = new ArrayString(size);
const int K = 1000;
System.DateTime t0 = System.DateTime.UtcNow;
for (int k = 0; k < K; k++)
{
x.Insert(0, 42);
}
System.DateTime t1 = System.DateTime.UtcNow;
double dt = 1000000 * (t1 - t0).TotalSeconds / K;
System.Console.WriteLine("dt = {0} microseconds; bytes = {3}; longs = {1}; popugai = {2}", dt, size, size/dt, size*8);
x = null;
System.GC.Collect();
}
System.Console.ReadLine();
}
}
Так что теперь замеряем сразу серию. Результаты:
$ mono TestCopy.exe
dt = 170.735 microseconds; bytes = 800000; longs = 100000; popugai = 585.702990013764
dt = 405.835 microseconds; bytes = 1600000; longs = 200000; popugai = 492.811117818818
dt = 1087.669 microseconds; bytes = 2400000; longs = 300000; popugai = 275.819206026834
dt = 3020.222 microseconds; bytes = 3200000; longs = 400000; popugai = 132.440595426429
dt = 5117.21 microseconds; bytes = 4000000; longs = 500000; popugai = 97.709494040698
dt = 6213.729 microseconds; bytes = 4800000; longs = 600000; popugai = 96.5603746156294
dt = 7427.909 microseconds; bytes = 5600000; longs = 700000; popugai = 94.239172827777
dt = 8333.403 microseconds; bytes = 6400000; longs = 800000; popugai = 95.9991974467093
dt = 9388.901 microseconds; bytes = 7200000; longs = 900000; popugai = 95.8578645147073
dt = 10307.17 microseconds; bytes = 8000000; longs = 1000000; popugai = 97.0198415277908
Размер кэша процессора у меня 2 мегабайта:
$ cat /proc/cpuinfo | grep cache
cache size : 2048 KB
cache_alignment : 64
cache size : 2048 KB
cache_alignment : 64
И явно видно, что попугаи после пересечения барьера в 2 мегабайта массива, стремительно начинают вымирать. Вымирают правда не все, и начиная с 4 мегабайт и выше популяция попугаев стабильно неизменна.
К чему это я?.. А! К тому, что в реальном текстовом редакторе кэш будет инвалидироваться реально часто, например после вызовов функций ядра (захотели скажем перерисовать окошко после того как ткнули в кнопку), либо просто графических либ (которые радостно выкинут из кеша этот текст, и засунут туда, скажем, битмапы отрендеренных шрифтов).