Тесты производительности php
В рамках подготовки к написанию следующей версии движка, начинаю тестирование текущей ситуации с производительностью php. Что бы написать самый быстрый движок(CMS) необходимо тщательно проштудировать теоретический материал и самое главное - проявить здравомыслие и протестировать всё самому. За много лет практики я успел прочитать порядочно статей по оптимизации скорости php, в коих было не мало ошибочных выводов и не верных подходов в тестировании, из-за которых точность вычислений и выводы вводят в заблуждение. Постепенно каждый из них опишу и проведу тестирование скорости работы одного или другого метода.
Тесты PHP проводились на двух конфигурациях
Компьютер:Apache/2.4.12 php 5.6.8 Linux version 3.13.0-24-generic (Ubuntu 4.8.2-19 x86_64) 8 ядер AMD FX-8350 Black Edition @ 4.60GHz (Cool'n'Quiet: 1.40GHz)Сервер:
Apache/2.2.27 PHP 5.5.14 Linux version 2.6.32-042stab105.14 (Red Hat 4.4.6-4) (CENTOS 6.6 x86_64) 4 ядра Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz
С другой конфигурацией будут помечены в статьях далее..
Тестирование php осуществляю следующим образом
define('LOOP',100000); function t($t=0){ $a=explode(' ',microtime()); $e=$a[1]+$a[0]; return (0==$t)?$e:$e-$t; } function f1(){ $i=0; while($i<LOOP){ //test ++$i; } } function f2(){ $i=0; while($i<LOOP){ //test ++$i; } } //измерение времени, чтоб не тратить время на создание в процессе.. $t[1]=$t[2]=$t[3]=$t[4]=$t[5]=$t[6]=$t[7]=$t[8]=$t[9]=t();//1-й функции $f[1]=$f[2]=$f[3]=$f[4]=$f[5]=$f[6]=$f[7]=$f[8]=$f[9]=t();//2-й функции //далее меняя порядок запускаю тесты $t[1]=t();f1();$t[1]=t($t[1]); $f[1]=t();f2();$f[1]=t($f[1]); $f[2]=t();f2();$f[2]=t($f[2]); $t[2]=t();f1();$t[2]=t($t[2]); ... //Вывод информации имеет свой оверхед поэтому echo вынесено в конец
В случае "гуляющих" из-за погрешности на занятость процессора результатов - то в одну то в другую сторону, буду играться с параметрами, сравнивать что чаще перевешивает и при каких условиях.
Результаты заносятся в таблицы.
Первый PHP тест естественно $i++ vs ++$i
В интернетах пишут мол ++i имеет 3 операции на асьме, а i++ аж четыре. По опыту могу сказать что инструкции имеют разную скорость, больше не значит медленнее в ряде случаев.
function f1(){ $i=0; $k=0; while($i<LOOP){ ++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k;++$k; ++$i; } } function f2(){ $i=0; $k=0; while($i<LOOP){ $k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++;$k++; ++$i; } }Компьютер:
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 100 000 | 0.013722 | 0.014492 | f1() | 0.000770 с. | 5.31 % |
2 | 100 000 | 0.010078 | 0.014650 | f1() | 0.004572 с. | 31.21 % |
3 | 100 000 | 0.010101 | 0.014486 | f1() | 0.004385 с. | 30.27 % |
4 | 100 000 | 0.010028 | 0.014546 | f1() | 0.004518 с. | 31.06 % |
5 | 100 000 | 0.010160 | 0.014507 | f1() | 0.004347 с. | 29.97 % |
6 | 100 000 | 0.010067 | 0.014617 | f1() | 0.004550 с. | 31.13 % |
7 | 100 000 | 0.010085 | 0.014780 | f1() | 0.004695 с. | 31.77 % |
8 | 100 000 | 0.010136 | 0.014482 | f1() | 0.004346 с. | 30.01 % |
9 | 100 000 | 0.010064 | 0.014584 | f1() | 0.004520 с. | 30.99 % |
Всего: 900 000 | 0.094441 | 0.131144 | f1() | 0.036703 с. | 27.99 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 100 000 | 0.070902 | 0.080058 | f1() | 0.009156 с. | 11.44 % |
2 | 100 000 | 0.054238 | 0.057771 | f1() | 0.003533 с. | 6.12 % |
3 | 100 000 | 0.059897 | 0.065339 | f1() | 0.005442 с. | 8.33 % |
4 | 100 000 | 0.047792 | 0.051816 | f1() | 0.004024 с. | 7.77 % |
5 | 100 000 | 0.048711 | 0.040605 | f2() | 0.008106 с. | 16.64 % |
6 | 100 000 | 0.039867 | 0.038331 | f2() | 0.001536 с. | 3.85 % |
7 | 100 000 | 0.037425 | 0.037627 | f1() | 0.000202 с. | 0.54 % |
8 | 100 000 | 0.037696 | 0.038230 | f1() | 0.000534 с. | 1.4 % |
9 | 100 000 | 0.038009 | 0.037861 | f2() | 0.000148 с. | 0.39 % |
Всего: 900 000 | 0.434537 | 0.447638 | f1() | 0.013102 с. | 2.93 % |
Результаты гуляют, причём при повышении количества до миллионов нивелируется (++$i быстрее на ~4%). В целом действительно можно сказать что ++i быстрее i++.