Вы не зашли.
Главная » PHP » Тесты производительности
#1. Gemorroj Off (107)
Administrator
2008.03.10 15:03
Тесты производительности различных часто употребляемых конструкций PHP кода и отдельных функций.
Для тестов использовался скрипт прилагаемый к этой статье http://wapinet.ru/textbook/speed.htm
Тестировалось на PHP 5.2.4 + Apache 2.2.4 + WinXP SP2 (Denwer 3)
Задача: просмотр содержимого папки.
Результаты
Код:
span style="color: #0000BB"><?php// 10000 проходов// и так 5 раз// 7.0788// 7.2023// 7.4333// 7.0996// 7.1290$dir = "./";$scan = scandir($dir);foreach($scan as $f){//print $f;}---// 7.3640// 7.4306// 7.3660// 7.4751// 7.2902$dir = "./";$open = opendir($dir);while(($f = readdir($open)) != false){//print $f;}closedir($open);---// 7.9307// 8.1111// 8.4703// 8.0594// 8.3077$dir = "./";$hand = dir($dir);while(($f = $hand->read()) != false){//print $f;}$hand->close();---// 53.0054// 53.6093// 52.9707// 53.2398// 53.3150$dir = "*";$glob = glob($dir);foreach($glob as $f){//print $f;}?>
// print $f - закомментированно для более точных результатов тестирования
glob вне конкуренции smile данная функция работает НАМНОГО медленнее остальных, тестировавшихся.
Остальные более-менее равны по производительности. Встроенный класс dir работает, как видим,  чуть медленнее, видимо сказывается ООП.

Продолжение следует...
Отредактировано Gemorroj (2008.03.22 10:10)
#2. Gemorroj Off (107)
Administrator
2008.03.22 10:10
Код:
span style="color: #0000BB"><?php// 250000 проходов// 4.0472// 3.9551// 3.9555// 3.9487// 3.9205$test = null;if($test == null){// print $test;}// 3.9390// 3.9610// 3.9629// 3.9878// 3.9631$test = null;if($test == ''){// print $test;}// 3.9386// 3.9192// 3.9468// 3.9178// 3.9390$test = null;if($test === null){// print $test;}// 3.5278// 3.5305// 3.7416// 3.6181// 3.5312$test = null;if(!$test){// print $test;}// 7.3735// 6.6924// 6.6803// 6.7138// 6.9515$test = null;if(empty($test)){// print $test;}// 7.0340// 6.7897// 6.8383// 6.7610// 6.8296$test = null;if(isset($test)){// print $test;}?>
Интересный момент, не точная проверка на соответствие, в данном тесте, выполняется столько же, сколько и точная (== и ===).
Так же код с применением isset или empty работает заметно медленнее, это связано с тем, что вызываются функции, а в остальных случаях для проверки работают операторы сравнения, которые по определению быстрее.
Из всех приведенных примеров кода, быстрее работает код с применением отрицания (!)
Отредактировано Gemorroj (2008.03.22 12:12)
#3. Gemorroj Off (107)
Administrator
2008.03.22 11:11
вот еще интересная инфа, взята из комментариев к CURL функциям на php.net smile
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
#4. Helqg Off (2)
Участник
2008.03.22 12:12
А проверка на пустоту empty()?
Стране нужны автобусы!
#5. Gemorroj Off (107)
Administrator
2008.03.22 12:12
да, точно smile не подумал, щас исправлюсь)
#6. Helqg Off (2)
Участник
2008.03.23 09:09
Да просто я всегда ей проверяю, хотелось бы быть уверенным в ее использовании.
Стране нужны автобусы!
#7. Gemorroj Off (107)
Administrator
2008.04.20 13:01
сравнивал mysql_fetch_assoc, mysql_fetch_array и mysql_fetch_row
тестировал следующим образом, 1 раз запускается этот код
Код:
span style="color: #0000BB"><?php// Хост, логин, пароль$con = mysql_connect('localhost','root','') or die ('Ошибка подключения к базе данных!');// Кодировкаmysql_query('SET NAMES `utf8`');// Имя БДmysql_select_db('gbs',$con);$q = mysql_query('SELECT * FROM `users`');?>
в таблице users 183 записи, состоит из 22 колонок.
далее 250000 раз запускалась одна из тестировавшихся функций.

вот что в результате имеем
Код:
$a = mysql_fetch_row($q);
4.9316
4.9642
4.9255
5.0077
4.9354
 
$a = mysql_fetch_assoc($q);
5.1141
5.0620
5.1188
5.0473
5.0907
 
$a = mysql_fetch_array($q);
5.1535
5.1544
5.2150
5.1027
5.2089
Если с mysql_fetch_row и mysql_fetch_assoc все более-менее понятно (mysql_fetch_row чуть быстрее, т.к. создает нумерованный массив, а не ассоциативный), то почему mysql_fetch_array практически не уступает mysql_fetch_assoc не совсем понятно. Ведь mysql_fetch_array создает целых 2 массива, и как мне казалось должна прилично уступать по скорости. Ан нет. Как это обьяснить без понятия.
#8. Helqg Off (2)
Участник
2008.04.20 21:09
там написанно не 2 массива, а массив с двойными индексами. Че это такое меня спрашивать не надо.
Стране нужны автобусы!
#9. Gemorroj Off (107)
Administrator
2008.06.23 12:12
Теперь Win XP SP3 wink
Вобщем страшное дело...
Код:
span style="color: #0000BB"><?php// 250000 проходовif(1)print '';/*2.81532.87822.92932.78122.81512.79462.82552.85112.82742.8898*/if(1){print '';}/*3.23253.22893.29253.23093.21443.26043.36183.24813.22013.2240*/?>
воооот...
даже не знаю что сказать( расстройство прям ='(
#10. Helqg Off (2)
Участник
2008.06.24 10:10
для 25 тысяч не фатальна 1 секунда
Стране нужны автобусы!
Страниц: 1 2 35 Все
Главная
WEB
PunBB Mod v0.6.2
0.017 s