Вы не зашли.
Тесты производительности различных часто употребляемых конструкций 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 вне конкуренции
данная функция работает НАМНОГО медленнее остальных, тестировавшихся.
Остальные более-менее равны по производительности. Встроенный класс
dir работает, как видим, чуть медленнее, видимо сказывается ООП.
Продолжение следует...
Отредактировано Gemorroj (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)
вот еще интересная инфа, взята из комментариев к 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
#4.
Helqg
Off
(2)
Участник
2008.03.22 12:12
А проверка на пустоту empty()?
Стране нужны автобусы!
да, точно
не подумал, щас исправлюсь)
#6.
Helqg
Off
(2)
Участник
2008.03.23 09:09
Да просто я всегда ей проверяю, хотелось бы быть уверенным в ее использовании.
Стране нужны автобусы!
сравнивал
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 массива, а массив с двойными индексами. Че это такое меня спрашивать не надо.
Стране нужны автобусы!
Теперь Win XP
SP3 Вобщем страшное дело...
Код:
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*/?> |
воооот...
даже не знаю что сказать( расстройство прям ='(
для 25 тысяч не фатальна 1 секунда
Стране нужны автобусы!