title
Description
Body
Тесты производительности различных часто употребляемых конструкций PHP кода и отдельных функций.
Для тестов использовался скрипт прилагаемый к этой статье http://wapinet.ru/textbook/speed.htm
Тестировалось на PHP 5.2.4 + Apache 2.2.4 + WinXP SP2 (Denwer 3)
Задача: просмотр содержимого папки.
Результаты
|
|
// print $f - закомментированно для более точных результатов тестирования
glob вне конкуренции данная функция работает НАМНОГО медленнее остальных, тестировавшихся.
Остальные более-менее равны по производительности. Встроенный класс dir работает, как видим, чуть медленнее, видимо сказывается ООП.
Продолжение следует...
Отредактировано Gemorroj (2008.03.22 07:53)
Неактивен
|
|
Интересный момент, не точная проверка на соответствие, в данном тесте, выполняется столько же, сколько и точная (== и ===).
Так же код с применением isset или empty работает заметно медленнее, это связано с тем, что вызываются функции, а в остальных случаях для проверки работают операторы сравнения, которые по определению быстрее.
Из всех приведенных примеров кода, быстрее работает код с применением отрицания (!)
Отредактировано Gemorroj (2008.03.22 09:59)
Неактивен
вот еще интересная инфа, взята из комментариев к CURL функциям на php.net
Calculating 50 queries to http://www.flickr.com/.
cURL took 9.550734 seconds.
file_get_contents() took 10.878360 seconds.
Calculating 50 queries to http://www.yahoo.com/.
cURL took 4.729566 seconds.
file_get_contents() took 10.443786 seconds.
Calculating 50 queries to http://www.ebay.com/.
cURL took 46.348250 seconds.
file_get_contents() took 52.685604 seconds.
Calculating 50 queries to http://www.godaddy.com/.
cURL took 1.505460 seconds.
file_get_contents() took 37.154304 seconds.
Calculating 50 queries to http://www.php.net/.
cURL took 13.136836 seconds.
file_get_contents() took 17.981879 seconds.
другими словами CURL неизбежно быстрее чем file_get_contents
Неактивен
сравнивал mysql_fetch_assoc, mysql_fetch_array и mysql_fetch_row
тестировал следующим образом, 1 раз запускается этот код
|
|
в таблице users 183 записи, состоит из 22 колонок.
далее 250000 раз запускалась одна из тестировавшихся функций.
вот что в результате имеем
|
|
Если с mysql_fetch_row и mysql_fetch_assoc все более-менее понятно (mysql_fetch_row чуть быстрее, т.к. создает нумерованный массив, а не ассоциативный), то почему mysql_fetch_array практически не уступает mysql_fetch_assoc не совсем понятно. Ведь mysql_fetch_array создает целых 2 массива, и как мне казалось должна прилично уступать по скорости. Ан нет. Как это обьяснить без понятия.
Неактивен
Теперь Win XP SP3
Вобщем страшное дело...
|
|
воооот...
даже не знаю что сказать( расстройство прям ='(
Неактивен
ну так для меня удобнее. без скобок для меня код становится абсолютно не читабельным. да и сами разработчики PHP рекомендуют использовать скобки везде. а вот на деле со скобками медленне получается код(
Неактивен
Кстати про читабельность. Ща прочитал- "Perl был основан на awk sed grep, и других средствах UNIX , и в результате при работе с перл часто получается код только для записи( то есть через несколько месяцов вы его понять не сумеете)." А ты про скобки
Неактивен
извечный спор, что быстрее, print или echo
500.000 проходов
|
|
вот такие результаты)
Неактивен
Я тут на сайтик наткнулся... Gemorroj, глянь... http://www.phpbench.com , если с инглишом дружишь(я думаю что дружишь ), почитай там... если не дружишь(или кто ещё глянет сайтик не знающий инглиша, перезагрузи страницу которая откроется пару раз...)..........
Ага, здорово. Особенно поразило на сколько быстрее код если подсчет кол-ва итераций вынести из цикла. А так же использование функций для работы с массивами array_keys() / array_values()
Неактивен
Кто-то просил потестить скорость работы операторов AND, &&, OR, ||.
Результаты приводить не буду, т.к. разницы в скорости вообще не заметил. 100.000 проходов с любым из этих операторов занимало около 1.6 секунды.
Неактивен
|
|
Как видно, шустрее всех substr, потом mb_substr и самая медленная iconv_substr
При чем, чем входящая строка больше, тем разница ощущается сильнее.
Вообще не совсем понятно, помему библиотеки (iconv и mbstring) имеющие по большей части одинаковое предназначение разделены на 2 библиотеки.
Неактивен
по ссылке в первом посте достаточно много информации на этот счет. http://wapinet.ru/textbook/speed.htm думаю повторяться не стоит.
Неактивен
Теперь PHP 5.3
файла не существует
error_reporting(0);
file_get_contents("xxx");
16.7541
17.4581
17.4037
14.7361
14.7268
@file_get_contents("xxx");
17.8958
16.7447
16.2829
14.8839
14.8261
а теперь ставим error_reporting(2039);
50.000 проходов
file_get_contents("xxx");
294.0389
@file_get_contents("xxx");
7.6748
такое получается из-за забивания буфера ошибками.
Неактивен
А можешь проверить с этим же значком, только истинное утверждение? Возможно в том случае, если не будет никаких ошибок, результаты будут другими?
Неактивен
10.000 проходов
file_get_contents(__FILE__);
// 6.7937
// 6.9678
// 6.5534
// 6.8022
// 6.7107
@file_get_contents(__FILE__);
// 7.1111
// 7.2268
// 6.8919
// 7.0816
// 7.0639
да, действительно, если файл существует, то подавление ошибок с помощью собаки замедляет работу.
Неактивен
Сегодня пол дня воевал со следующим SQL запросом
|
|
Требовалось оптимизировать... Результатов выборки без DISTINCT примерно 80.000 с DISTINCT примерно 150.
Так вот скорость мягко говоря удручает. Более 2-х секунд на средненьком сервере.
Решилось следующим образом
|
|
Совсем небольшие изменения в коде, а запрос выполняется примерно за 0.2 секунды. В принципе тоже не ахти, но прогресс все равно очень заметный. В 10 раз.
Неактивен
Вот еще вопрос. Вывод текста с переменными. Есть три варианта.
1 - echo "text $aaa text";
2 - echo 'text '.$aaa.' text';
3 - echo "text ".$aaa." text";
В первом варианте интерпретатор должен проверять весь текст на $ и пробел, что и замедляет процесс. Это типа ищет переменную.
Во втором варианте проверка не идет (процесс быстрее), но используется конкатенация (даже две), что по идее должно замедлять процесс.
Третий вариант из области антивариантов и "Так писать не надо", так что его можно не иметь ввиду.
Собственно вопрос в том, какой из вариантов, 1 или 2, работает быстрее? Для чистоты эксперимента текст должен быть в двух вариантах. Небольшим - до 50 символов и большим - до 300 символов. Это связано с первым вариантом, там потому что поиск идет. В принципе может кто то и так знает результат?
Неактивен
ну здесь этот вопрос рассматривался http://wapinet.ru/textbook/speed.htm
правда было это очень давно и, вероятно , на php4. Чуть позже попробую потестить на php5.3
Неактивен
Посмотрел... Скажем так - я в шоке... К тому, что увидел могу добавить, что
$x="test ".$test." test ".$test." test ".$test;
быстрее на 10% чем
$x="test ".$test." test ".$test." test ".$test."";
то есть если последнюю переменную не закрывать, то это хорошо. Не смог правда проверить с одинарными кавычками
Неактивен
PHP 5.3.1
30 тысяч проходов
|
|
Добавлено спустя 7 минут 18 секунд:
JInn написал:
Посмотрел... Скажем так - я в шоке... К тому, что увидел могу добавить, что
$x="test ".$test." test ".$test." test ".$test;
быстрее на 10% чем
$x="test ".$test." test ".$test." test ".$test."";
то есть если последнюю переменную не закрывать, то это хорошо. Не смог правда проверить с одинарными кавычками
а что здесь шокирующего? нафига делать эту лишнюю конкатенацию с пустой строкой?
Неактивен
Интересно, но как по мне, ради этого не стоит избегать switch, ведь там возможно без break; подключить сразу несколько условий, да и визуально кода немного меньше)
Неактивен
Akdmeh, да, зачастую switch удобнее. Но если скорость критически важный параметр, то приходится жертвовать удобством. Я на этот switch обратил внимание когда профилировал Gmanager. Оказалось что одна совсем ничем не примечательная функция определения расширения файла, занимает приличную долю ремени. Тем более что вызывается несколько раз в цикле. Пришлось отказаться от switch и переписать на if / elseif / else. Немного, но прирост производительности это дало.
Неактивен
Конечно, в циклах это бывает важно.
Кст, сравни у себя mb_substr и iconv_substr - интересно что у тебя выйдет.
Неактивен
ок
Кстати, сейчас искал самый быстрый способ прохода по папке, без подпапок. Вероятно это достигается следующим способом:
|
|
Пробовал в т.ч. новые итераторы, но с ними как минимум в 3 раза медленнее.
Неактивен
iconv_substr быстрее примерно на треть.
100000 проходов
|
|
Такая же ситуация, если переменной $a присвоить какую-нибудь длинную строку.
Нужно отметить, что многое зависит от кодировки. Если у mb_substr стоит какая-нибудь однобайтовая кодировка, а у iconv_substr мультибайтовая, то естественно mb_substr выиграет.
Неактивен
MySQLi. Запрос с подготовленным выражением и без него.
|
|
Неактивен
Неактивен