Что быстрее: glob () или opendir () - PullRequest
3 голосов
/ 04 мая 2010

Что быстрее между glob () и opendir (), для чтения файлов размером около 1-2К?

Ответы [ 5 ]

8 голосов
/ 04 мая 2010

http://code2design.com/forums/glob_vs_opendir

Очевидно, opendir() должно быть (и есть) быстрее, так как он открывает обработчик каталога и позволяет выполнять итерации. Поскольку glob() должен проанализировать первый аргумент, потребуется больше времени (плюс glob обрабатывает рекурсивные каталоги, поэтому он сканирует подкаталоги, что увеличивает время выполнения.

7 голосов
/ 04 мая 2010

glob и opendir делают разные вещи. glob находит пути, соответствующие шаблону, и возвращает их в массиве, а opendir возвращает только дескриптор каталога. Чтобы получить те же результаты, что и для glob, необходимо вызвать дополнительные функции, которые необходимо учитывать при сравнительном анализе, особенно если это включает сопоставление с образцом.

Билл Карвин недавно написал статью об этом. См:

2 голосов
/ 04 мая 2010

Не уверен, что это идеальное сравнение, но glob() позволяет вам также включать шаблоны, подобные оболочке, где opendir находится непосредственно там для каталогов, делая его быстрее.

1 голос
/ 04 мая 2010

другой вопрос, на который можно ответить с небольшим количеством тестирования. у меня была удобная папка с 412 вещами в ней, но результаты не должны сильно отличаться, я думаю:

igor47@whisker ~/test $ ls /media/music | wc -l
412
igor47@whisker ~/test $ time php opendir.php 
414 files total

real    0m0.023s
user    0m0.000s
sys 0m0.020s
igor47@whisker ~/test $ time php glob.php 
411 files total

real    0m0.023s
user    0m0.010s
sys 0m0.010s
0 голосов
/ 18 апреля 2017

Хорошо,

Короче говоря:

  • , если вам нужны полные имена файлов + пути, отсортировано , глобус практически непобедим.
  • если вам нужны полные имена файлов + пути несортированные , используйте glob с GLOB_NOSORT.
  • , если вам нужны только имена, а не сортировку, используйте opendir + loop.

Вот и все.

Еще несколько мыслей:

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

  1. Имея огромный список файлов, glob будет сортировать быстрее - он использует метод сортировки файловой системы, который всегда будет лучше.(Он знает, что сортирует, а PHP нет, PHP сортирует хэшированный массив произвольных строк, сравнивать их просто нечестно.)

  2. Возможно, вы захотите отфильтроватьсписок с некоторыми расширениями или масками имен файлов, для которых glob действительно эффективен.Конечно, у вас есть fnmatch () , но вызов его каждый раз никогда не будет быстрее, чем фильтр системного уровня, подготовленный для этой самой работы.

  3. С другой стороныhand, glob возвращает значительно больший объем текста (каждое имя с полным путем), поэтому при большом количестве файлов вы можете столкнуться с ограничениями выделения памяти.Для zillion файлов glob не ваш друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...