Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FindFirst/FindNext и скорость


TUser ©   (2004-07-30 12:47:00) 

Почему сабж так тормозит. Загружаю в ListView имена файло, их примерно 2000, висит минут 5. Тормозит точно не ListView, т.к. если те же файлы выделить в OpenDialog и пройтись по всем OpenDialog.Files - то все практически мгновенно. При показе OpenDialog'а тоже никаких особых тормозов нет, т.е. может он каким-то образом быстро получить список файлов. Как сделать быстрый перебор всех файлов?


GrayFace   (2004-07-30 14:53:00) [1]

16000 файлов грузятся за 1 секунду на слабом (Celeron 433, ж/д 10 GB) компе если {...}=Add(sr.Name);


GuAV   (2004-07-30 14:48:00) [2]

Может OpenDialog их выводит отсортированными, и на сортировку время не тратится; а если через FindFirst, то родная сортировка ListView или твоя сортировка тормозит?


GrayFace   (2004-07-30 14:41:00) [3]

Anatoly Podgoretsky ©   (30.07.04 13:23) [9]
>Подходящей для измерения является папка System, там несколько тысяч файлов.
Только 1500. В Delphi\Lib больше. Хотя это сильно зависит от числа компонент.


Anatoly Podgoretsky   (2004-07-30 13:38:00) [4]

Ужас, у меня приведеный в [5] код выполнился меньше чем за секунду.


TUser   (2004-07-30 13:27:00) [5]

Папка локальная, антивирус не сканирует. Код выполняется 5 минут. Можно вместо него написать
beginupdate;
if OpenDialog1.execute then
  for i:=0 to OpenDialog1.Files.Count-1 do
     {...}
endupdate;
где {...} точно такой же. Затем открываем OD, он через пару сек. выводит список файлов, все выделяем - код отрабатывает секунды за 3!


Anatoly Podgoretsky   (2004-07-30 13:23:00) [6]

MegaVolt   (30.07.04 13:16) [8]
Зачем? Надо просто строго измерить приведеный код, ничего в него не добавляя. Выдать наконец более подробную информацию, что за папка, сколько в ней файлов, где расположена, может в другом домене и низкоскоростной канал, может антивирус проверяет все сканируемые файлы и т.д. Подходящей для измерения является папка System, там несколько тысяч файлов.


MegaVolt   (2004-07-30 13:16:00) [7]

Заремь вывод в ListView и померяй скорость.


GuAV   (2004-07-30 13:12:00) [8]


> А OpenDialog получает просто список имен файлов в данном
> каталоге, в то время как сабж получает еще и аттрибуты,
> наверное поэтому все там и медленнее.

OpenDialog тоже их получает. иначе как он сортирует и определяет ReadOnly, выводит теблицу, etc.
ну попробуй FindFirstFile/FindNextFile, убедись, что сабж не тормозит.


BillyJeans   (2004-07-30 13:11:00) [9]

тормоз в 5й строке!


TUser   (2004-07-30 13:03:00) [10]

Тормозит не ListView, т.к. повторяю - можно туда же добавить все эти итемы и гораздо быстрее. А OpenDialog получает просто список имен файлов в данном каталоге, в то время как сабж получает еще и аттрибуты, наверное поэтому все там и медленнее.

Код самый обычный, такой же как в хелпе
beginupdate;
if FindFirst(Path+'*.*',faAnyFile,sr) = 0 then
repeat
  if (sr.attr and faAnyfile) = sr.Attr then begin
     {...}
     end;
until FindNext(sr) <> 0;
endupdate;


GuAV   (2004-07-30 12:55:00) [11]

Вряд ли сабж тормозит. Он не сильно завернут вокруг соотв функций ОС. Верноятно, ты просто забыл ListView.Items.BeginUpadte/ListView.Items.EndUpadte.
Ещё может быть что то, что пробуется сначала дольше, а потом уже работает кэш.


clickmaker   (2004-07-30 12:54:00) [12]


> TUser ©   (30.07.04 12:47)

Код перебора?


panov   (2004-07-30 12:53:00) [13]

Зависит от внешних условий(количество файлов в каталоге, количество отфильтрованных файлов).

В OpenDialog ты не ведешь сканирование списка файлов, а просто выделяешь, поэтому в этом случае другая ситуация.

хотя у меня никогда особо не тормозил FindFirst...


Anatoly Podgoretsky   (2004-07-30 12:53:00) [14]

Ошибка в 17 строке


Наверх

Титульная страница Поиск, карта сайта Написать письмо