Замедление работы при использовании TList

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Написал набор консольных утилит (три), предназначеных для получения списка характеристик файлов (Имя, размер, атрибуты, дата), сравнения списков и просмотра списков в человеческом виде. Характеристика каждого файла - структура следующего вида:

Код: Выделить всё

  // Тип - общая характеристика файла
  TFileInfo = record
    FileName: String;
    Attr: Longint;
    Size: Longint;
    DateTime: TDateTime;
  end;


Память при добавлении характеристики в список выделяется при помощи GetMem, а указатели хранятся в TList. Если список составляется для относительно небольших директорий (до 20000 файлов/директорий) все работает относительно быстро. Когда количество переваливает за 100000 - это просто несколько десятков файлов/директорий в секунду!

Как бороться с подобным поведением класса TList?

PS: Исходники тайной не являются, кому необходимо - отправлю по почте. Предназначены программы для мониторинга файловой системы. Компилируются как под win32 (исключая 9x/Me) так и под Linux, но я их пытаюсь использовать исключительно под Linux.

Все это тестируется на P4 2.8 GHz, 1GB RAM, 160 GB SATA HDD :)
Аватара пользователя
Сергей Смирнов
энтузиаст
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва
Контактная информация:

Сообщение Сергей Смирнов »

У меня вот такой код выполняется менее секунды:

Код: Выделить всё

L := TList.Create;
for i:=0 to 1000000 do
begin
    PFI := GetMem(SizeOf(TFileInfo));
    L.Add(PFI);
end;


PIII-800 512Mb WinXP

Ищи проблему в другом месте.
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Всем спасибо, вопрос снимается. По невнимательности поставил сортировку списка в конце процедуры, забыв что она вызывается рекурсивно :)
Ответить