Скорость работы PHP в Windows. Отчего так медленно?
Собственно пару месяцев назад случилось так, что пришлось развернуть Apache непосредственно под Windows (Windows 8). Раньше работал под виртуальной машиной с Debian и все было более менее нормально.
Работая с проектами на Symfony2 столкнулся с приличным прогибом производительности. Профайлер показал что дольше всего отрабатывали функции preg_match, file_exists и PDO. Проблемы с PDO удалось решить указав в качестве хоста непосредственно IP адрес, но вот с file_exists и preg_match проблемы остались. Выполнение этих функций занимает порядка 40%-50% отработки скриптов.
Причем на машине с ubuntu/debian профайлер никаких аномалий не показывает да и вообще код отрабатывает в десятки раз быстрее (0,3 секунды против 3-4 секунд на Windows).
В порядке эксперимента сегодня установил Debian под виртуальной машиной на том же разделе, где находится код проекта. Сделал замеры производительности и оказалось что под управлением Debian, даже в виртуальной машине, прирост производительности в PHP достигает 300% а для MySQL запросы выполняются в 2 раза быстрее.
Система чистая, ничего особо не изменялось в настройках. Все (от Windows до виртуальной машины) размещено на SSD. Меня лично удивляет настолько низкие показатели производительности. Возможно что-то не так именно у меня, посему интересует сталкивался ли кто с таким и как лечится.
Ну как, вообще домашней системой у меня служит Windows8, потому что я так хочу. Множество мелких плюшек меня радуют, да и вообще я люблю все новое.
А Apache пришлось развернуть для работы. Не было времени возиться с Linux-ом (в плане устанавливать на виртуалку) ну и так вот и остался по воле случая.
@Fesor можеш запускать код на виртуальною машине запуская код на смонтированной в оперативной памяти файловой системе, в которой, том числе, находиться и база данных. Если нет обращения к ресурсам которые не в оперативке то быстрота может возрасти на порядок)
file_exists — это самое слабое звено + сумма всех инклудов. В винде на порядок медленней идет доступ к файловой системе. Отчасти из-за этого производительность стдрадает, если убрать все куски кода которые хоть каким-то образом касаются файловой системы, то скорость будет уступать линуксу незначительно (один файл с алгоритмом каким-то). И пока такая ситуация есть придется мириться.
Я могу ошибаться, но вполне вероятно тут несколько причин:
1 Отличия в файлах конфигурации из коробки для Linux и Windows версий
2 Всетаки Windows не настолько родная среда как unix системы
Сделаю diff конфигов как руки дойдут, но мне просто интересно. Вроде бы file_exists должен отрабатывать минимум времени. Да и различия в плане производительности при работе с регулярными выражениями тоже смущают.
Про регулярные не уверен, возможно дело именно в реализации библиотеки под Windows. А вот file_exists наверняка связан с файловой системой. Как минимум в Windows регистро независимые имена а вот в Linux наоборот admin.php и Admin.php разные файлы будут. Наверняка различий там еще больше, чем те, что сразу на ум приходят.
Я не смог победить. Даже ramdisk не спасает. Уж слишком много инклудится в Симфони. В одном только кеше лежит 1к файлов на 40Мб, и для каждого файла оно еще и дату модификации проверяет… Пришлось ставить vbox. Там есть возможность запуска машин без окна, чтобы не забивать таскбар.
Мне помогла покупка SSD-диска. С использованием APC, в prod окружении запрос идет 200ms, в dev — 1000ms.
До замены стоял ноутбучный 2.5" 5400 об/мин — запрос в dev окружении (с использованием APC) выполнялся 5-8 секунд.