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;

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

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

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

Test.StringList

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

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

Количество записей Время min (мс) Время max (мс) Уникальные значения
100 000  47 63  Все
 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»

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *