Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сравнение на скорость различных функций рекурсивного обхода
 
 автор: Akira   (02.08.2005 в 21:30)   письмо автору
3.4 Кб
 
 

Запускаем, смотрим и делаем выводы.

   
 
 автор: isset   (02.08.2005 в 21:55)   письмо автору
 
   для: Akira   (02.08.2005 в 21:30)
 

Не стоит забывать что scan_dir при втором запуске работает уже с кэшем, вот в общем результаты первого запуска:

0) scan_dir() - 0.638489
1) scan_dir_glob() - 0.308141
2) list_dir() - 0.405994
3) scandir() - 0.328558

Второго:

0) scan_dir() - 0.323847
1) scan_dir_glob() - 0.362860
2) list_dir() - 0.441348
3) scandir() - 0.363610

   
 
 автор: cheops   (02.08.2005 в 21:58)   письмо автору
 
   для: Akira   (02.08.2005 в 21:30)
 

Абсолютно одинаковые результаты, особенно после многократного прогона, выбивается только list_dir() - на 20% дольше выполняется.

PS В scan_dir_glob() вместо текущей директории указан пустой путь.

   
 
 автор: isset   (02.08.2005 в 22:05)   письмо автору
 
   для: cheops   (02.08.2005 в 21:58)
 

list_dir() на самом деле вещь мощная, поэтому тормозит так, можно написать скрипт использующий все что можно из DirectoryIterator-а , при этом скорость выполнения повысится лишь на 10-20% и то что сделать обычными средствами будет трудно ...

   
 
 автор: isset   (02.08.2005 в 22:16)   письмо автору
 
   для: isset   (02.08.2005 в 22:05)
 

Вот в общем прицепил, время выполнения:
0) list_dir() - 0.671398

Слабо аналог сделать для PHP4 ?)

Я к тому что list_dir сильно проигрывает в простых задачах, но в более крупных выигрывает

   
 
 автор: Akira   (02.08.2005 в 22:28)   письмо автору
 
   для: isset   (02.08.2005 в 22:16)
 

Зато у глоб, есть маска поиска :))

   
 
 автор: isset   (02.08.2005 в 22:30)   письмо автору
 
   для: Akira   (02.08.2005 в 22:28)
 

у list_dir тоже есть если захотеть :)

   
 
 автор: Akira   (02.08.2005 в 22:37)   письмо автору
 
   для: isset   (02.08.2005 в 22:30)
 

Допустимые флаги:

GLOB_MARK - Добавляет слеш к каждому возвращаемому предмету

GLOB_NOSORT - Возвращает файлы в таком виде, в котором они содержатся в директории (без сортировки)

GLOB_NOCHECK - Возвращает шаблон поиска, если с его помощью не был найден ни один файл.

GLOB_NOESCAPE - Обратные слеши не экранируют метасимволы

GLOB_BRACE - Раскрывает {a,b,c} для совпадения с 'a', 'b' или 'c'

GLOB_ONLYDIR - Возвращает только директории, совпадающие с шаблоном

   
 
 автор: isset   (02.08.2005 в 22:39)   письмо автору
 
   для: Akira   (02.08.2005 в 22:37)
 

Никто не мешает расширить класс RecursiveDirectoryIterator :)

   
 
 автор: Akira   (02.08.2005 в 22:30)   письмо автору
 
   для: cheops   (02.08.2005 в 21:58)
 

Подрузомеваеться, что маска ("*") обозначает текущий каталог.
(".") и ("..") он сразу игнорирует.

   
 
 автор: Akira   (02.08.2005 в 22:32)   письмо автору
 
   для: Akira   (02.08.2005 в 22:30)
 

Мое имхо удобнее из простоты использовать глоб версию для пхп4 и стандартную для хпх5. А вы как думаете?

   
 
 автор: isset   (02.08.2005 в 22:38)   письмо автору
 
   для: Akira   (02.08.2005 в 22:32)
 

Зависит от конкретной задачи, если нужно получить только список файлов, то соглашусь . Если необходимо получить кроме списка еще и полную информацию о файле , то легче использовать итераторы (list_dir)

   
 
 автор: Akira   (02.08.2005 в 22:49)   письмо автору
 
   для: isset   (02.08.2005 в 22:38)
 

!!!!!!!!!!!!!!!!!!
0) scan_dir() - 7.286823
1) scan_dir_glob() - 4.501647
2) list_dir() - 5.539380
3) scandir() - 4.297088
3438 файлов - 3 папки.
Позже проверил на 5 тыс. файлах и около 500 папок.
list_dir вылетел за 10 сек предел.
Остальные держаться в рамках 7 сек.

   
 
 автор: isset   (02.08.2005 в 23:31)   письмо автору
 
   для: Akira   (02.08.2005 в 22:49)
 

0) scan_dir() - 30.432499
1) scan_dir_glob() - 23.175559
2) list_dir() - 27.096471
3) scandir() - 24.190917

Файлов: 18 175, папок: 1 919, общий размер 1,03 гб

   
 
 автор: Akira   (02.08.2005 в 23:43)   письмо автору
 
   для: isset   (02.08.2005 в 23:31)
 

:) Хех...А не плохо мой глоб себя повел...Только это все теория :)

   
 
 автор: isset   (03.08.2005 в 00:22)   письмо автору
 
   для: Akira   (02.08.2005 в 23:43)
 

После долгих раздумий почему же однако глоб так быстро работает нашел ошибку в тесте, в функции scan_dir_glob кусок кода:

if (is_dir($filename)) // если директория - рекурсия
                    { 
                        scan_dir($filename); 
                        echo "$filename <br />"; 
                    } 

Вызывает почему-то scan_dir вместо scan_dir_glob! Заменив получилось:

if (is_dir($filename)) // если директория - рекурсия
                    { 
                        scan_dir_glob($filename); 
                        echo "$filename <br />"; 
                    } 


И вот реальные результаты:
Первый запуск:

0) scan_dir() - 1.574023
1) scan_dir_glob() - 1.100256
2) list_dir() - 0.860709
3) scandir() - 0.676903

Второй запуск:

0) scan_dir() - 0.674803
1) scan_dir_glob() - 1.269258
2) list_dir() - 0.913654
3) scandir() - 0.833540




Немного побольше файлов:

0) scan_dir() - 6.791906
1) scan_dir_glob() - 7.232772
2) list_dir() - 7.063564
3) scandir() - 7.370550

   
 
 автор: Akira   (03.08.2005 в 00:43)   письмо автору
 
   для: isset   (03.08.2005 в 00:22)
 

Да моя вина :) Сменил.

0) scan_dir() - 6.562161
1) scan_dir_glob() - 4.344995
2) list_dir() - 4.558613
3) scandir() - 4.480896

Проверка около 3 тыс файлов.

0) scan_dir() - 2.456326
1) scan_dir_glob() - 2.349604
2) list_dir() - 3.271566
3) scandir() - 2.544668

Чуть меньше файло, но больше папок.

   
 
 автор: isset   (03.08.2005 в 00:44)   письмо автору
 
   для: Akira   (03.08.2005 в 00:43)
 

не может просто глоб выигрывать так :) Там ведь еще и регулярные выражения используются..

   
 
 автор: Akira   (03.08.2005 в 00:49)   письмо автору
 
   для: isset   (03.08.2005 в 00:44)
 

Нет они там не используютсья, там, что-то другое. Просто глоб не использует других функций, как и scandir(). Меня беспокоит, одно. Скадир проигрывает по тестам глобу. Зачем тогда его было делать?

   
 
 автор: isset   (03.08.2005 в 00:52)   письмо автору
 
   для: Akira   (03.08.2005 в 00:49)
 

Регулярные...Другого нет :)
Скорее всего эти функции по-разному справляются с разными задачами

   
 
 автор: Akira   (03.08.2005 в 00:58)   письмо автору
 
   для: isset   (03.08.2005 в 00:52)
 

"... совпадающие с шаблоном pattern согласно правилам, используемым в функции glob() библиотеки libc.." (c)php.net

   
 
 автор: Akira   (03.08.2005 в 00:54)   письмо автору
3.5 Кб
 
   для: Akira   (02.08.2005 в 21:30)
 

немного подправленая версия. Кстати глоб еще и сортировал массив, данную фишку я отключил. Читает как есть на сервере.

   
 
 автор: isset   (03.08.2005 в 01:13)   письмо автору
 
   для: Akira   (03.08.2005 в 00:54)
 

Какая разница в данном случае между шаблоном и регулярным выражением?

   
 
 автор: Akira   (03.08.2005 в 01:35)   письмо автору
 
   для: isset   (03.08.2005 в 01:13)
 

Используються символы * и ? :)

   
 
 автор: isset   (03.08.2005 в 01:59)   письмо автору
 
   для: Akira   (03.08.2005 в 01:35)
 

В исходниках glob.c:

#define    DOLLAR        '$'
#define    DOT        '.'
#define    EOS        '\0'
#define    LBRACKET    '['
#define    NOT        '!'
#define    QUESTION    '?'
#define    QUOTE        '\\'
#define    RANGE        '-'
#define    RBRACKET    ']'
#define    SEP        DEFAULT_SLASH
#define    STAR        '*'
#define    TILDE        '~'
#define    UNDERSCORE    '_'
#define    LBRACE        '{'
#define    RBRACE        '}'
#define    SLASH        '/'
#define    COMMA        ','


типа это просто так висит там?) Там можно задавать шаблон [0-9]{2} например...

   
 
 автор: Akira   (03.08.2005 в 02:05)   письмо автору
 
   для: isset   (03.08.2005 в 01:59)
 

Думаю был смысл называть это шаблоном , а не рег. выражением.

   
 
 автор: isset   (03.08.2005 в 02:18)   письмо автору
 
   для: Akira   (03.08.2005 в 02:05)
 

шаблон == рег. выражение

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования