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"

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