Задача: Производительность 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.
Ниже приведен пример выполнения (запуск производился несколько раз):
Количество записей | Время 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"