Автор Тема: Архитектура текстового редактора  (Прочитано 25517 раз)

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #30 : Март 12, 2012, 04:25:33 pm »
dt = 4945,2086 microseconds
win7starter с доступными 2GB RAM
Запускал несколько раз. Результаты приблизительно  одинаковы

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #31 : Март 12, 2012, 04:34:10 pm »
А в списке установленных приложений нашёл что-то вида "Microsoft Net Framework 4 Client Profile"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Архитектура текстового редактора
« Ответ #32 : Март 12, 2012, 05:49:08 pm »
Pentium 4, DDR 400, время = 7'805 микросекунд

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Архитектура текстового редактора
« Ответ #33 : Март 12, 2012, 05:50:55 pm »
dt = 4945,2086 microseconds
А память наверное DDR2 800?

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Архитектура текстового редактора
« Ответ #34 : Март 12, 2012, 06:41:23 pm »
Хотя, нет Fusion E450 поддерживает DDR3. Остаётся вопрос с частотой...

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #35 : Март 12, 2012, 07:59:10 pm »
...
И так. Номер буквы - 4 байта, номер атрибутов - 4 байта, итого 8 байтов на символ. Измеряем сколько времени займёт вставка символа в позицию 0 если длина текста 1'000'000 восьмибайтовых символов.
...
Получаем всего лишь 962 микросекунды на Core i7 2600K с памятью DD3 1600 MHz.

Не забываем, что в 2014 появится DDR4 которая раза в два-три быстрее чем DDR3.
А при чем тут быстродействие памяти вообще? У тебя же весь массив (8 мегабайт) в кэш поместился.

У P4 и всяких там Fusion E450 столько кеша нет, потому резко просаживается производительность (в 10 раз).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #36 : Март 12, 2012, 08:08:26 pm »
Про точность.
Из всех методов измерения длительности - на моей тачке самый точный Stopwatch
Если выполнить такой код
      var sw = Stopwatch.StartNew();
      Debug.WriteLine("DateTime.UtcNow.Ticks");
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine(DateTime.UtcNow.Ticks);
      Debug.WriteLine("Environment.TickCount");
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine(Environment.TickCount);
      Debug.WriteLine("sw.ElapsedTicks");
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
      Debug.WriteLine(sw.ElapsedTicks);
то результат будет такой
DateTime.UtcNow.Ticks
634671793967968750
634671793967968750
634671793967968750
634671793967968750
634671793967968750
634671793967968750
634671793968125000
634671793968125000
634671793968125000
634671793968125000
634671793968125000
634671793968125000
Environment.TickCount
519301015
519301015
519301015
519301015
519301015
519301015
519301015
519301015
519301015
519301015
519301031
519301031
519301031
519301031
519301031
519301031
519301031
519301031
sw.ElapsedTicks
199727
202547
205395
208358
211166
213921
216699
219554
222412
225179
227929
231585

alexus

  • Гость
Re: Архитектура текстового редактора
« Ответ #37 : Март 12, 2012, 08:19:43 pm »
...
И так. Номер буквы - 4 байта, номер атрибутов - 4 байта, итого 8 байтов на символ. Измеряем сколько времени займёт вставка символа в позицию 0 если длина текста 1'000'000 восьмибайтовых символов.
...
Получаем всего лишь 962 микросекунды на Core i7 2600K с памятью DD3 1600 MHz.

Не забываем, что в 2014 появится DDR4 которая раза в два-три быстрее чем DDR3.
А при чем тут быстродействие памяти вообще? У тебя же весь массив (8 мегабайт) в кэш поместился.

У P4 и всяких там Fusion E450 столько кеша нет, потому резко просаживается производительность (в 10 раз).
А может быть спросить у операционной системы размер страницы памяти и... размещать файл на страницах, выстраивая страницы в виде списка (одно/двунаправленного). Страница может быть заполнена полностью или частично. Тогда все сдвиги будут "крошечными"...

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #38 : Март 12, 2012, 08:23:34 pm »
Хотя, нет Fusion E450 поддерживает DDR3. Остаётся вопрос с частотой...
DDR3 частота 1333. CPU-z показывает 670. Люди подсказали, что ризультат этой программы нужно умножать на 2 (наверное, физики). В итоге и получается где-то 1333. Но, возможно из-за того, что чуть ли не весь комп запихан в один кристалл, контроллер памяти одноканальный.

Насколько я знаю - это существенно.

Но можно попробовать проверить идею Алексея. У меня по 512 КБ на каждое из 2 ядер. Так что можно посмотреть прирост производительности при условии, что строка будет занимать 512 КБ, а не 8 МБ.

alexus

  • Гость
Re: Архитектура текстового редактора
« Ответ #39 : Март 12, 2012, 08:33:50 pm »
Хотя, нет Fusion E450 поддерживает DDR3. Остаётся вопрос с частотой...
DDR3 частота 1333. CPU-z показывает 670. Люди подсказали, что ризультат этой программы нужно умножать на 2 (наверное, физики). В итоге и получается где-то 1333. Но, возможно из-за того, что чуть ли не весь комп запихан в один кристалл, контроллер памяти одноканальный.

Насколько я знаю - это существенно.

Но можно попробовать проверить идею Алексея. У меня по 512 КБ на каждое из 2 ядер. Так что можно посмотреть прирост производительности при условии, что строка будет занимать 512 КБ, а не 8 МБ.
Пересылку большого объёма памяти разумнее написать с помощью MMX расширений... Минуя кэши...

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #40 : Март 12, 2012, 08:38:19 pm »
Пересылку большого объёма памяти разумнее написать с помощью MMX расширений... Минуя кэши...
Вообще через DMA - минуя процессор :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #41 : Март 12, 2012, 09:15:37 pm »
Но можно попробовать проверить идею Алексея. У меня по 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 мегабайт и выше популяция попугаев стабильно неизменна.

К чему это я?.. А! К тому, что в реальном текстовом редакторе кэш будет инвалидироваться реально часто, например после вызовов функций ядра (захотели скажем перерисовать окошко после того как ткнули в кнопку), либо просто графических либ (которые радостно выкинут из кеша этот текст, и засунут туда, скажем, битмапы отрендеренных шрифтов).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

alexus

  • Гость
Re: Архитектура текстового редактора
« Ответ #42 : Март 13, 2012, 05:51:48 am »
Пересылку большого объёма памяти разумнее написать с помощью MMX расширений... Минуя кэши...
Вообще через DMA - минуя процессор :-)
Кто же пустит работать с DMA... это надо иметь доступ на нулевой уровень защиты процессора, то есть, либо внедриться в ядро ОС, либо написать свою ОС... :) А регистры MMX, равно как и регистры сопроцессора доступны любой программе.
Была где-то статья AMD, где сравнивались скорости разных способов копирования памяти, обычной пересылкой (rep movs), через регистры MMX, через регистры сопроцессора, prefetch и пр. Если отбросить prefetch, то через регистры MMX/сопроцессора копирование происходит быстрее всего.
Но оптимальным было бы хранение текста на страницах... Исчезла бы зависимость от размера текстового файла, любой сдвиг затрагивал бы не более 2-х страниц.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #43 : Март 13, 2012, 06:05:18 am »
Кто же пустит работать с DMA... это надо иметь доступ на нулевой уровень защиты процессора, то есть, либо внедриться в ядро ОС, либо написать свою ОС... :) А регистры MMX, равно как и регистры сопроцессора доступны любой программе.
Была где-то статья AMD, где сравнивались скорости разных способов копирования памяти, обычной пересылкой (rep movs), через регистры MMX, через регистры сопроцессора, prefetch и пр. Если отбросить prefetch, то через регистры MMX/сопроцессора копирование происходит быстрее всего.
Но оптимальным было бы хранение текста на страницах... Исчезла бы зависимость от размера текстового файла, любой сдвиг затрагивал бы не более 2-х страниц.
Тут такая штука - MMX на современном процессоре может и не быть.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems