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

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

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Архитектура текстового редактора
« Ответ #45 : Март 13, 2012, 11:32:02 am »
Про точность. Из всех методов измерения длительности - на моей тачке самый точный Stopwatch

Для измерения точного монотонного времени написал класс:

   public static class Clock
   {
       public static double GetSeconds ();
   }

Возвращает количество секунд прошедшее с момента старта программы (точнее с момента инициализации статического класса Clock, но он инициализируется в main).

Он имеет следующую реализацию

Под виндой:

      private static class Windows_PerformanceCounter
      {
         [System.Runtime.InteropServices.DllImport("kernel32.dll")]
         private static extern int QueryPerformanceFrequency (out long frequency);

         [System.Runtime.InteropServices.DllImport("kernel32.dll")]
         private static extern int QueryPerformanceCounter (out long counter);

         private static readonly double scale, offset;

         static Windows_PerformanceCounter ()
         {
            long frequency;
            QueryPerformanceFrequency(out frequency);
            if (frequency > 0)
            {
               scale = 1.0 / frequency;
               long count;
               QueryPerformanceCounter(out count);
               offset = scale * count;
            }
         }

         public static double GetSeconds ()
         {
            long count;
            QueryPerformanceCounter(out count);
            return scale * count - offset;
         }
      }

Под Линуксом:

      private static class Unix_librt
      {
         private const int CLOCK_MONOTONIC = 1;

         private struct Time
         {
            public uint seconds;
            public uint nanoseconds;
         }

         [System.Runtime.InteropServices.DllImport("/lib/librt.so.1")]
         private static extern int clock_gettime (int clockId, ref Time time);

         private static double offset;

         public static double GetSeconds ()
         {
            Time t = new Time();
            clock_gettime(CLOCK_MONOTONIC, ref t);
            return t.seconds + 0.000000001*t.nanoseconds - offset;
         }

         static Unix_librt ()
         {
            offset = GetSeconds();
         }
      }

Точность от 200 нс до 1400 нс в зависимости от компьютера (от часов в чиспете). 200 нс было на каком-то современном ксеонистом 16 ядерном серваке, а 1400 на каком-то старом компьютере времён Pentium 4.


Кстати под Линуксом System.DateTime.UtcNow имеет такую же высокую точность, но имеет недостаток -- не монотонен (зависит от перевода часов).

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #46 : Март 13, 2012, 12:52:12 pm »
Для измерения точного монотонного времени написал класс:
Под Линуксом не знаю, а под Виндой Stopwatch так и работает. Вот кусок из него (получено Reflector'ом):
public static long GetTimestamp()
{
    if (IsHighResolution)
    {
        long num = 0L;
        SafeNativeMethods.QueryPerformanceCounter(out num);
        return num;
    }
    return DateTime.UtcNow.Ticks;
}

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #47 : Апрель 03, 2012, 03:10:11 pm »
Сейчас измерил на современном компьютере время вставки элемента в массив -- оно ничтожно. Поэтому для представления текста на современном компьютере уже не нужны никакие там сложные структуры, а достаточно взять просто массив символов. Вставляешь символ -- тупо сдвигаешь все последующие символы на одну позицию и не паришься на счёт того, что это якобы медленно. Уже не медленно!!!
Если уж пример на C#, то там для этого есть более эффективный метод - Array.Copy(...)
Оказывается, есть еще эффективнее - класс Buffer.  "This class provides better performance for manipulating primitive types than similar methods in the System.Array class".

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

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Архитектура текстового редактора
« Ответ #48 : Апрель 03, 2012, 05:15:40 pm »
Оказывается, есть еще эффективнее - класс Buffer
Несколько лет назад я их мерил. Для крохотных массивов побеждает for. Для средненьких массивов вперёд вырывается System.Buffer. Затем, при дальнейшем увеличении размера массива разница между System.Buffer и System.Array стремится к нулю.

DIzer

  • Гость
Re: Архитектура текстового редактора
« Ответ #49 : Апрель 03, 2012, 05:42:14 pm »
Насколько существенен отрыв (а также , какова оценка "среднего" диапазона, т.е скажем так каков диапазон для 5 кратного превосходства)

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

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Архитектура текстового редактора
« Ответ #50 : Апрель 03, 2012, 09:21:59 pm »
Насколько существенен отрыв (а также , какова оценка "среднего" диапазона, т.е скажем так каков диапазон для 5 кратного превосходства)
Разница не так велика. А диапазоны сильно зависят от размеров кэшей процессора первого, второго и третьего уровней. Ещё конечно есть разница между for побайтовым и for по Int64 и по более толстым структурам (кэш линейка раньше была 32 байта, а на современных процессорах наверное больше, вот for по структурам размером с кэш-линейку работает быстро).  А для очень больших массивов всё выходит примерно на одну асимптотику.

DIzer

  • Гость
Re: Архитектура текстового редактора
« Ответ #51 : Апрель 04, 2012, 07:52:50 am »
Понятно - сильная завязка на реализацию и железо...т.е к использованию только когда это РЕАЛЬНО  :) необходимо.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Архитектура текстового редактора
« Ответ #52 : Октябрь 21, 2013, 03:53:09 pm »
Пост по теме: http://habrahabr.ru/post/197650/
Y = λf.(λx.f (x x)) (λx.f (x x))