По мотивам - http://18delphi.blogspot.ru/2013/10/immutable.html
Насколько показывает МОЯ практика - сравнение ОДИНАКОВЫХ строк - это в некотором роде "бутылочное горлышко".
Ибо РАЗНЫЕ строки (с РАЗНОЙ длиной) с ХОРОШЕЙ вероятностью НЕ СРАВНЯТСЯ хотя бы где-то на половине длины.
А ОДИНАКОВЫЕ строки - будут сравниваться НА ВСЮ длину.
Если строки АТОМАРНЫ и фреймворк это поддерживает, то ОДИНАКОВЫЕ строки сравниваются (с хорошей вероятностью) очень быстро.
Самый плохой результат получаем в том случае, если АТОМАРНЫЕ строки всё же представляются РАЗНЫМИ объектами, но по сути - равны.
Но опять же - исходя из МОЕЙ практики использования АТОМАРНЫХ строк - вероятность такого исхода - ОЧЕНЬ мала.
Никому ничего не навязываю. Просто - делюсь.
Если кому-то интересны МЕТРИКИ - могу попробовать их предоставить. Если они ДЕЙСТВИТЕЛЬНО интересны.
С моей же стороны - было бы интересно увидеть МЕТРИКИ показывающие ОБРАТНОЕ.
НИКОМУ НИЧЕГО не навязываю. Нравится - ЗДОРОВО. Скажете СПАСИБО - тем более - ЗДОРОВО. Не нравится - простите уж. Что отнял ваше время.
P.S. ДА! И "родные" Delphi-строки - я "МАЛО" использую (отчасти из-за их mutable и связанным с этим thread-safe). Я использую:
Насколько показывает МОЯ практика - сравнение ОДИНАКОВЫХ строк - это в некотором роде "бутылочное горлышко".
Ибо РАЗНЫЕ строки (с РАЗНОЙ длиной) с ХОРОШЕЙ вероятностью НЕ СРАВНЯТСЯ хотя бы где-то на половине длины.
А ОДИНАКОВЫЕ строки - будут сравниваться НА ВСЮ длину.
Если строки АТОМАРНЫ и фреймворк это поддерживает, то ОДИНАКОВЫЕ строки сравниваются (с хорошей вероятностью) очень быстро.
Самый плохой результат получаем в том случае, если АТОМАРНЫЕ строки всё же представляются РАЗНЫМИ объектами, но по сути - равны.
Но опять же - исходя из МОЕЙ практики использования АТОМАРНЫХ строк - вероятность такого исхода - ОЧЕНЬ мала.
Никому ничего не навязываю. Просто - делюсь.
Если кому-то интересны МЕТРИКИ - могу попробовать их предоставить. Если они ДЕЙСТВИТЕЛЬНО интересны.
С моей же стороны - было бы интересно увидеть МЕТРИКИ показывающие ОБРАТНОЕ.
НИКОМУ НИЧЕГО не навязываю. Нравится - ЗДОРОВО. Скажете СПАСИБО - тем более - ЗДОРОВО. Не нравится - простите уж. Что отнял ваше время.
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
а я когда-то делал глобальное (для приложения) хранилище строк. все строки, приходящие из БД прогоняются через такой чёрный ящик. если строки там нет- то она добавляется. если есть -наращивается счётчик ссылок. в итоге получаем небольшой прирост скорости сортировки/группировки в гридах и сокращается расход памяти. но это заметно не вооружённым глазом только на больших объёмах данных, что бывает довольно редко. плюс накладные расходы на ящик. в итоге это сейчас не используется (ну почти).. надо будет отыскать этот исходник..
ОтветитьУдалитьНу я так примерно и делаю.. У меня - значительный прирост производительности и экономия памяти. Правда там хитрая стратегия создания объектов. В зависимости от их длины. 1-байтные строки распределяютя не так как 2-байтные, и те так как 3-байтные. Ну и т.д. И там ИМЕННО объекты, а не string. Ну и опять же - у меня же - ОБРАБОТКА текста. 80% задач. Предметная область такая.
УдалитьПлюс - использование View. И подстрок "по месту". А не Delete/Copy.
УдалитьЧего-то не понял, а такая строка immutable чтоли? А если сделать так:
ОтветитьУдалитьl3CString.AsWStr^ = 'x'?
Не знаю насчет метрик, мне они не нужны, а вот про фреймворк, как устроен, где что хранится, как обеспечивается прогон через него ВСЕХ строк (иначе он лажать будет), как быть со сравнением со строковыми константами и т.д. и т.п.
Во сколько это все обходится.
Как у него с многопоточностью отдельно интересно.
Анекдот про бензопилу знаете?
УдалитьМожно ведь извратиться и массой других способов.
В общем на подобные вопросы - отвечать желания нет.
PChar(Random)^ := 'x'
УдалитьНе пробовали? Попробуйте.. Не пожалеете...
Простите, не понимаю. Какие лично Вы видете в применении описанных автором строк проблемы с многопоточностью? С обычными дельфи-строками они возникают? Что значит, простите "как обеспечивается прогон через него ВСЕХ строк"?
УдалитьИ - да, относительно AsWStr^ := 'x'?, как говорила моя любимая школьная учительница "вены можно и вилкой вскрыть". В C++ тоже, знаете ли, какой-нибудь сумрачный тевтонский гений, вооруженный const_cast с reinterpert_cast впридачу может устроить такой локальный экстерминатус, что мало никому не покажется - ну и дальше-то что?
Витя! ПЯТЬ БАЛЛОВ :-) сам хотел что-то подобное написать, но не находил "нужных слов".
УдалитьТебе ОПРЕДЕЛЁННО нужно поделиться "своим программистским опытом" во "вдумчивых статьях". ИМХО.