скорость операций типа is_readable() / file_exists() ...

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Проблема следующая: пытаюсь использовать phing для разворачивания проекта. Основное, что делает build-файл, --- <copy>. То есть фактически есть два каталога --- источник и приёмник, phing'у надо пробежаться по ним обоим, проверить какие файлы в приёмнике отсутствуют или имеют более старое время изменения, скопировать из источника изменения. В каталогах несколько сотен файлов + служебная информация svn, которая игнорируется.

Так вот, под виндой это отрабатывает за 3,5 секунды, а под FreeBSD на сервере --- меньше чем за секунду.

Проверил при помощи xdebug'овского профайлинга где тупит: на функциях file_exists(), is_readable(), is_dir(), is_file(). Под виндой они оказались в первой десятке по потраченному времени, под FreeBSD в первой десятке из файловых операций только Directory::read().

При этом дело явно не в скорости диска (я в качестве системного диска вообще SSD использую) и не в том, что винда --- суксь и мастдай, ибо если подточить build-файл напильником и запустить через java'овский ant, то он отработает существенно быстрее чем за секунду (предполагаю, что там выполняются аналогичные операции).

Вопрос знакомым с потрохами похапэ: какого хрена?

windows.png
freebsd.png
 

tony2001

TeaM PHPClub
скорость выполнения файловых операций зависит только от файловой системы и ОС.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
скорость выполнения файловых операций зависит только от файловой системы и ОС.
Ну я тоже так думал, но почему тогда ant выполняет тот же build-файл с теми же файловыми операциями на той же файловой системе и той же ОС в несколько раз быстрее?
 

tony2001

TeaM PHPClub
предположительно выполняет предположительно те же операции?
предположительно strace поможет.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
И я бы, кстати, не грешил сразу на похапэ, если бы до этого собственными глазами не видел, как при подключении curl'а консольный похапэ под виндой на пару секунд задумывается при запуске.

Без курла:
Код:
C:\web>cmd /v:on /c "echo !TIME! & php -v & echo !TIME!"
 0:44:57,98
PHP 5.3.6 (cli) (built: Mar 17 2011 10:37:07)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Xdebug v2.1.1, Copyright (c) 2002-2011, by Derick Rethans
 0:44:58,03
с курлом:

Код:
C:\web>cmd /v:on /c "echo !TIME! & php -v & echo !TIME!"
 0:48:27,72
PHP 5.3.6 (cli) (built: Mar 17 2011 10:37:07)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Xdebug v2.1.1, Copyright (c) 2002-2011, by Derick Rethans
 0:48:29,73
Откуда я знаю, может при чтении метаданных файлов там тоже срабатывает гениальная программистская находка.
 

tony2001

TeaM PHPClub
консольный CURL ты хотел сказать, наверное?
впрочем, не важно.

ты не поверишь, но код file_exists() и других операций вполне даже открыт, можешь глазками посмотреть и увидеть, что приходит всё дело к обычным системным вызовам.
конечно, в Яве всё не так, у них ведь всё в процессоре прошито.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Sad Spirit
у никсов всегда была хорошая оптимизация простейших файловых операций - все работает на pid-файлах, сокетах и atime,
а у винды все завязано на реестре
jvm может эти вещи оптимизировать, а php этим не занимаются
попробуй просто написать на С программу, которая проверяет несколько сотен файлов - меньше чем за секунду на винде она не отработает
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Так, до strace и написания программы на C пока не добрался, но попробовал скачать и запустить Non Thread Safe версию PHP --- phing отрабатывает на той же задаче за 1,5 секунды.

Ыыыыыы.
 
Сверху