Delphi — StringList производительность

Задача: Производительность StringList’а. Можно ли записать в StringList 100 000 записей и сколько это займет времени?
Инструментарий: Delphi 10 Seatle; Железо: Intel Core 2 Quad 6600 2.4 GHz, 8 Гб ОЗУ, Windows 10.
Решение: Для тестирования производительности StringList’а воспользуемся следующим кодом:

var StrList: TStringList; I: Integer; Str: string; const ItemsCount = 1000000; begin Randomize; StrList := TStringList.Create; try for I := 0 to ItemsCount - 1 do begin Str := Format('%d some string %d', [Random(10524), Random(10524)]); StrList.Add(Str); end; finally FreeAndNil(StrList); end; end;
Code language: Delphi (delphi)

Усложним задачу, и будем добавлять в список только уникальные значения, для этого воспользуемся встроенными возможностями StringList’ (свойством Duplicates = dupIgnore). Ранее я описывал как добавить в StringList уникальные значения в заметке «Список уникальных значений». Для этого добавим две строчки в существующий код:

... try StrList.Sorted := True; //новая строка StrList.Duplicates := dupIgnore; //новая строка for I := 0 to ItemsCount - 1 do ...
Code language: PHP (php)

Я подготовил небольшое приложение, которое выполняет вышеописанный код. Исходники можно посмотреть на GitHub.

Test.StringList
Рис. 1 — производительность StringList’a

Ниже приведен пример выполнения (запуск производился несколько раз):

Количество записейВремя min (мс)Время max (мс)Уникальные значения
100 000 4763 Все
 1 000 000 578 594 Все
100 000 3000 3141 ~99 964
 1 000 000 50 6547 54 3656~ 995 781

PS:
— Исходники на GitHub
— Исполняемый файл находится в папке "/BIN/Win32/Debug"

Добавить комментарий