Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Оптимизация работы с большими записями в Delphi 10.1 Berlin на Windows 10: ускорение цикла обхода списка TList" ```

Delphi , Синтаксис , Записи и Множества

Оптимизация работы с большими записями в 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Записи и Множества ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:55:42/0.005648136138916/1