#1 2008.03.10 15:44

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6585
Карма: 107
Профиль Веб-сайт

Тесты производительности

Тесты производительности различных часто употребляемых конструкций PHP кода и отдельных функций.
Для тестов использовался скрипт прилагаемый к этой статье http://wapinet.ru/textbook/speed.htm
Тестировалось на PHP 5.2.4 + Apache 2.2.4 + WinXP SP2 (Denwer 3)
Задача: просмотр содержимого папки.
Результаты

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?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:53)

Неактивен

#2 2008.03.22 10:53

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6585
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?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:59)

Неактивен

#3 2008.03.22 11:06

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6585
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

вот еще интересная инфа, взята из комментариев к 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 2008.03.22 12:03

Helqg
Участник
Откуда: 52 регион
Зарегистрирован: 2008.01.23
Сообщений: 306
Карма: 2
Профиль

Re: Тесты производительности

А проверка на пустоту empty()?


Стране нужны автобусы!

Неактивен

#5 2008.03.22 12:49

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6585
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

да, точно smile не подумал, щас исправлюсь)

Неактивен

#6 2008.03.23 09:07

Helqg
Участник
Откуда: 52 регион
Зарегистрирован: 2008.01.23
Сообщений: 306
Карма: 2
Профиль

Re: Тесты производительности

Да просто я всегда ей проверяю, хотелось бы быть уверенным в ее использовании.


Стране нужны автобусы!

Неактивен

#7 2008.04.20 13:25

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6585
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

сравнивал mysql_fetch_assoc, mysql_fetch_array и mysql_fetch_row
тестировал следующим образом, 1 раз запускается этот код

Код:

1
2
3
4
5
6
7
8
9
10
<?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 раз запускалась одна из тестировавшихся функций.

вот что в результате имеем

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$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 2008.04.20 21:02

Helqg
Участник
Откуда: 52 регион
Зарегистрирован: 2008.01.23
Сообщений: 306
Карма: 2
Профиль

Re: Тесты производительности

там написанно не 2 массива, а массив с двойными индексами. Че это такое меня спрашивать не надо.


Стране нужны автобусы!

Неактивен

#9 2008.06.23 12:51

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6585
Карма: 107
Профиль Веб-сайт

Re: Тесты производительности

Теперь Win XP SP3 wink
Вобщем страшное дело...

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
// 250000 проходов
 
if(1)
print '';
/*
2.8153
2.8782
2.9293
2.7812
2.8151
2.7946
2.8255
2.8511
2.8274
2.8898
*/
 
if(1){
print '';
}
/*
3.2325
3.2289
3.2925
3.2309
3.2144
3.2604
3.3618
3.2481
3.2201
3.2240
*/
?>

воооот...
даже не знаю что сказать( расстройство прям ='(

Неактивен

#10 2008.06.24 10:22

Helqg
Участник
Откуда: 52 регион
Зарегистрирован: 2008.01.23
Сообщений: 306
Карма: 2
Профиль

Re: Тесты производительности

для 25 тысяч не фатальна 1 секунда


Стране нужны автобусы!

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.015 s