![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 строке