Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ускорение работы с TStringList в Delphi: использование TDictionary и другие оптимизации

Delphi , Компоненты и Классы , Списки

Работа с большими объемами строковых данных в Delphi может быть довольно ресурсоемкой, особенно когда требуется быстрый доступ к значениям по ключу. Одним из способов ускорения работы с такими данными является использование класса TDictionary вместо стандартного TStringList.

Проблема с TStringList

Рассмотрим типичную ситуацию, когда все строки приложения загружаются в TStringList в процессе выполнения:

procedure PopulateStringList;
begin
  EnglishStringList.Append('CAN_T_FIND_FILE=It is not possible to find the file');
  EnglishStringList.Append('DUMMY=Just a dummy record');
  // Добавление 2000 записей
  EnglishStringList.Sorted := True; // Автоматическая сортировка не влияет на IndexOfName
end;

function GetTranslation(ResStr: String): String;
var
  iIndex: Integer;
begin
  iIndex := EnglishStringList.IndexOfName(ResStr);
  if iIndex >= 0 then
    Result := EnglishStringList.ValueFromIndex[iIndex]
  else
    Result := ResStr + ' (Translation N/A)';
end;

По умолчанию, метод IndexOfName не использует преимущества сортировки списка, что приводит к линейному поиску и замедлению работы при большом количестве записей.

Использование TDictionary

В качестве альтернативы TStringList можно использовать TDictionary, который обеспечивает быстрый доступ к значениям благодаря использованию хеш-таблицы:

procedure PopulateStringList;
begin
  EnglishDictionary := TDictionary<String, String>.Create;
  EnglishDictionary.Add('CAN_T_FIND_FILE', 'It is not possible to find the file');
  EnglishDictionary.Add('DUMMY', 'Just a dummy record');
  // Добавление 2000 записей
end;

function GetTranslation(ResStr: String): String;
var
  ValueFound: Boolean;
begin
  ValueFound := EnglishDictionary.TryGetValue(ResStr, Result);
  if not ValueFound then Result := Result + '(Trans N/A)';
end;

Использование TDictionary в Delphi 2009 и более новых версиях позволяет достичь значительного ускорения работы с данными.

Альтернативные решения

Для тех, кто по каким-то причинам не может использовать TDictionary, существуют и другие варианты:

  • THashedStringList: Предоставляет более быстрый доступ к элементам списка, но требует пересчета хеш-таблицы при изменении данных.
  • Двойной список: Использование двух TStringList — одного для хранения только ключей и указателя на второй список с значениями, что позволяет использовать более эффективный поиск в отсортированном списке.
  • Класс-оболочка (Class Helper): Перепрограммирование метода IndexOfName для использования бинарного поиска в отсортированном TStringList и линейного поиска в остальных случаях.

Заключение

Использование TDictionary является одним из наиболее эффективных способов ускорения работы с TStringList в Delphi. Однако, важно учитывать, что выбор метода зависит от конкретных требований и условий использования в приложении.

Создано по материалам из источника по ссылке.

Ускорение работы с `TStringList` в Delphi через использование `TDictionary` и другие оптимизации для повышения производительности при работе с большими объемами строковых данных.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-16 04:20:35/0.00357985496521/0