Работа с большими объемами строковых данных в 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.