среда, 16 октября 2013 г.

Коротко. Ещё об атомарных строках

По мотивам - http://18delphi.blogspot.ru/2013/10/immutable.html

Насколько показывает МОЯ практика - сравнение ОДИНАКОВЫХ строк - это в некотором роде "бутылочное горлышко".

Ибо РАЗНЫЕ строки (с РАЗНОЙ длиной) с ХОРОШЕЙ вероятностью НЕ СРАВНЯТСЯ хотя бы где-то на половине длины.

А ОДИНАКОВЫЕ строки - будут сравниваться НА ВСЮ длину.

Если строки АТОМАРНЫ и фреймворк это поддерживает, то ОДИНАКОВЫЕ строки сравниваются (с хорошей вероятностью) очень быстро.

Самый плохой результат получаем в том случае, если АТОМАРНЫЕ строки всё же представляются РАЗНЫМИ объектами, но по сути - равны.

Но опять же - исходя из МОЕЙ практики использования АТОМАРНЫХ строк - вероятность такого исхода - ОЧЕНЬ мала.

Никому ничего не навязываю. Просто - делюсь.

Если кому-то интересны МЕТРИКИ - могу попробовать их предоставить. Если они ДЕЙСТВИТЕЛЬНО интересны.

С моей же стороны - было бы интересно увидеть МЕТРИКИ показывающие ОБРАТНОЕ.

НИКОМУ НИЧЕГО не навязываю. Нравится - ЗДОРОВО. Скажете СПАСИБО - тем более - ЗДОРОВО. Не нравится - простите уж. Что отнял ваше время.

P.S. ДА! И "родные" Delphi-строки - я "МАЛО" использую (отчасти из-за их mutable и связанным с этим thread-safe). Я использую:

 Tl3WString = packed object
  {* Строка с кодировкой и с длиной. }
 public
   S : PAnsiChar; // Собственно строка.
   SLen : Integer; // Длина.
   SCodePage : SmallInt; // Кодовая страница.
 end;//Tl3WString

 Il3CString = interface(Il3Base)
  {* Константная строка }
   ['{D1D21F4B-3909-4E95-B2BF-99D984D6A370}']
   function pm_GetAsWStr: Tl3WString;
   property AsWStr: Tl3WString
     read pm_GetAsWStr;
     {* Возвращает данные строки. }
 end;//Il3CString

8 комментариев:

  1. а я когда-то делал глобальное (для приложения) хранилище строк. все строки, приходящие из БД прогоняются через такой чёрный ящик. если строки там нет- то она добавляется. если есть -наращивается счётчик ссылок. в итоге получаем небольшой прирост скорости сортировки/группировки в гридах и сокращается расход памяти. но это заметно не вооружённым глазом только на больших объёмах данных, что бывает довольно редко. плюс накладные расходы на ящик. в итоге это сейчас не используется (ну почти).. надо будет отыскать этот исходник..

    ОтветитьУдалить
    Ответы
    1. Ну я так примерно и делаю.. У меня - значительный прирост производительности и экономия памяти. Правда там хитрая стратегия создания объектов. В зависимости от их длины. 1-байтные строки распределяютя не так как 2-байтные, и те так как 3-байтные. Ну и т.д. И там ИМЕННО объекты, а не string. Ну и опять же - у меня же - ОБРАБОТКА текста. 80% задач. Предметная область такая.

      Удалить
    2. Плюс - использование View. И подстрок "по месту". А не Delete/Copy.

      Удалить
  2. Чего-то не понял, а такая строка immutable чтоли? А если сделать так:
    l3CString.AsWStr^ = 'x'?
    Не знаю насчет метрик, мне они не нужны, а вот про фреймворк, как устроен, где что хранится, как обеспечивается прогон через него ВСЕХ строк (иначе он лажать будет), как быть со сравнением со строковыми константами и т.д. и т.п.
    Во сколько это все обходится.
    Как у него с многопоточностью отдельно интересно.

    ОтветитьУдалить
    Ответы
    1. Анекдот про бензопилу знаете?
      Можно ведь извратиться и массой других способов.

      В общем на подобные вопросы - отвечать желания нет.

      Удалить
    2. PChar(Random)^ := 'x'

      Не пробовали? Попробуйте.. Не пожалеете...

      Удалить
    3. Простите, не понимаю. Какие лично Вы видете в применении описанных автором строк проблемы с многопоточностью? С обычными дельфи-строками они возникают? Что значит, простите "как обеспечивается прогон через него ВСЕХ строк"?
      И - да, относительно AsWStr^ := 'x'?, как говорила моя любимая школьная учительница "вены можно и вилкой вскрыть". В C++ тоже, знаете ли, какой-нибудь сумрачный тевтонский гений, вооруженный const_cast с reinterpert_cast впридачу может устроить такой локальный экстерминатус, что мало никому не покажется - ну и дальше-то что?

      Удалить
    4. Витя! ПЯТЬ БАЛЛОВ :-) сам хотел что-то подобное написать, но не находил "нужных слов".

      Тебе ОПРЕДЕЛЁННО нужно поделиться "своим программистским опытом" во "вдумчивых статьях". ИМХО.

      Удалить