Оптимизация работы с большими записями в Delphi 10.1 Berlin на Windows 10: ускорение цикла обхода списка TList
В статье рассматривается проблема замедления выполнения циклов, работающих со списком записей в среде разработки Delphi 10.1 Berlin под управлением операционной системы Windows 10. Основное внимание будет уделено крупным записям, для которых производительность обхода списка существенно ниже по сравнению с меньшими записями.
Описание проблемы
Пользователь столкнулся с проблемой: при работе со списком записей в Delphi 10.1 Berlin на Windows 10, он заметил, что цикл, проходящий по TList<T> крупных записей, выполняется значительно медленнее. В качестве примера были представлены две записи разного размера: tTestRecord1 и tTestRecord2. При тестировании времени выполнения циклов выяснилось, что обход списка с крупной записью занимает гораздо больше времени.
Код на Object Pascal (Delphi)
type
tTestRecord1 = record
Field1: array[0..4] of Integer;
Field2: array[0..4] of Extended;
Field3: string;
end;
tTestRecord2 = record
Field1: array[0..4999] of Integer;
Field2: array[0..4999] of Extended;
Field3: string;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
_List, _Record, _Time, i: type depends on context;
begin
// Инициализация списка и добавление элементов для tTestRecord1
end;
procedure TForm1.Button2Click(Sender: TObject);
var
_List, _Record, _Time, i: type depends on context;
begin
// Инициализация списка и добавление элементов для tTestRecord2
end;
Подробный разбор проблемы
При использовании TList<T> с крупными записями происходит копирование данных при каждом доступе к элементу списка, что существенно замедляет работу программы. Это связано с тем, что записи в TList представлены как значения (value types), а не ссылки на объекты (reference types). При обращении к полю запись полностью копируется во временную переменную.
Предложенные решения
Использование свойства Capacity
Предустановка размера списка помогает избежать частых перераспределений памяти и, как следствие, ускоряет работу с большими объемами данных. Свойство Capacity позволяет заранее выделить память под все элементы списка.
Переход на использование массивов
Использование динамических массивов вместо TList<T> позволяет избежать копирования записей и напрямую обращаться к полям элементов, что значительно ускоряет доступ к данным.
Изменение типов данных
Вместо использования типа Extended, который имеет размер 10 байт и не является степенью двойки, рекомендуется использовать Double или Real (алиас для Double), которые имеют размер 8 байт и лучше подходят для работы с памятью.
Пример оптимизации
{$APPTYPE CONSOLE}
uses
System.Diagnostics,
System.Generics.Collections;
type
tTestRecord2 = record
Field1: array[0..4999] of Integer;
Field2: array[0..4999] of Extended;
Field3: string;
end;
procedure Main;
var
i, N: Integer;
Stopwatch: TStopwatch;
List: TList<tTestRecord2>;
Rec: tTestRecord2;
begin
N := 100000; // Количество элементов для теста
List := TList<tTestRecord2>.Create;
List.Capacity := N;
for i := 0 to N-1 do
List.Add(Rec);
Stopwatch := TStopwatch.StartNew;
for i := 0 to N-1 do
begin
// Использование прямого доступа к элементам списка ускоряет работу
if List.List[i].Field3 = 'abcde' then
Break;
end;
Writeln(Stopwatch.ElapsedMilliseconds);
end.
begin
Main;
Readln;
end.
Заключение
При работе с большими записями в Delphi важно учитывать особенности их копирования и доступа к данным. Использование свойства Capacity, переход на массивы вместо списков, а также изменение типов данных могут значительно ускорить работу программы.
Эта статья представляет собой обзор проблемы замедления работы циклов при обходе больших записей в Delphi 10.1 Berlin и предлагает конкретные шаги для оптимизации производительности.
Проблема заключается в замедлении выполнения циклов при работе со списками больших записей в среде разработки Delphi 10.1 Berlin на Windows 10, и рассматриваются способы ускорения обхода таких списков, включая использование свойства Capacity, переход на
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.