php 7 строгая типизация
Наконец появилась в php 7 строгая типизация. Проведём тесты производительности и узнаем какой прирост можно получить если заставить компилятор меньше думать о типах.
function test1($x,$y){ return $x+=$y; } function test2(int $x,int $y): int{ return $x+=$y; } function f1(){ $i=0;$x=0;while(++$i<LOOP)$x=test1($x,$i); } function f2(){ $i=0;$x=0;while(++$i<LOOP)$x=test2($x,$i); }
Результаты тестирования php7 строгая типизация и без
Компьютер: (php 7.1.4)№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 000 000 | 0.054704 | 0.074529 | f1() | 0.019825 с. | 26.6 % |
2 | 1 000 000 | 0.054470 | 0.076018 | f1() | 0.021548 с. | 28.35 % |
3 | 1 000 000 | 0.054631 | 0.074365 | f1() | 0.019734 с. | 26.54 % |
4 | 1 000 000 | 0.054649 | 0.074449 | f1() | 0.019800 с. | 26.6 % |
5 | 1 000 000 | 0.054758 | 0.074401 | f1() | 0.019643 с. | 26.4 % |
6 | 1 000 000 | 0.054599 | 0.074487 | f1() | 0.019888 с. | 26.7 % |
7 | 1 000 000 | 0.054510 | 0.074590 | f1() | 0.020080 с. | 26.92 % |
8 | 1 000 000 | 0.054509 | 0.074485 | f1() | 0.019976 с. | 26.82 % |
9 | 1 000 000 | 0.054681 | 0.074630 | f1() | 0.019949 с. | 26.73 % |
Всего: 9 000 000 | 0.491512 | 0.671955 | f1() | 0.180443 с. | 26.85 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 000 000 | 0.077415 | 0.105765 | f1() | 0.028350 с. | 26.8 % |
2 | 1 000 000 | 0.063401 | 0.105080 | f1() | 0.041679 с. | 39.66 % |
3 | 1 000 000 | 0.043285 | 0.055173 | f1() | 0.011888 с. | 21.55 % |
4 | 1 000 000 | 0.044085 | 0.056424 | f1() | 0.012339 с. | 21.87 % |
5 | 1 000 000 | 0.045681 | 0.057604 | f1() | 0.011923 с. | 20.7 % |
6 | 1 000 000 | 0.043757 | 0.055212 | f1() | 0.011455 с. | 20.75 % |
7 | 1 000 000 | 0.043472 | 0.054673 | f1() | 0.011201 с. | 20.49 % |
8 | 1 000 000 | 0.043429 | 0.056345 | f1() | 0.012916 с. | 22.92 % |
9 | 1 000 000 | 0.043742 | 0.055458 | f1() | 0.011716 с. | 21.13 % |
Всего: 9 000 000 | 0.448267 | 0.601734 | f1() | 0.153467 с. | 25.5 % |
Тест со строками
Сделал несколько разных тестов со строками и указания типов переменных (php будет подгонять под тип выходящие/выходящие переменные функции), во всех примерно одинаковые результаты с перевесом 1 функции.. Приведу последний, специально поданы перевёрнутые типы..
function test1($x,$y){ return $x.=$y; } function test2(string $x, string $y): string{ return $x.=$y; } function f1(){ $i=0;$x='';while(++$i<LOOP)$x=test1((int)$x,$i); } function f2(){ $i=0;$x='';while(++$i<LOOP)$x=test2((int)$x,$i); }Компьютер: (php 7.1.4)
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 10 000 | 0.004994 | 0.005149 | f1() | 0.000155 с. | 3.01 % |
2 | 10 000 | 0.005041 | 0.005121 | f1() | 0.000080 с. | 1.56 % |
3 | 10 000 | 0.005077 | 0.005282 | f1() | 0.000205 с. | 3.88 % |
4 | 10 000 | 0.005019 | 0.005140 | f1() | 0.000121 с. | 2.35 % |
5 | 10 000 | 0.004872 | 0.005035 | f1() | 0.000163 с. | 3.23 % |
6 | 10 000 | 0.004955 | 0.005089 | f1() | 0.000134 с. | 2.63 % |
7 | 10 000 | 0.005038 | 0.005091 | f1() | 0.000053 с. | 1.04 % |
8 | 10 000 | 0.004982 | 0.005101 | f1() | 0.000119 с. | 2.33 % |
9 | 10 000 | 0.004923 | 0.005027 | f1() | 0.000104 с. | 2.07 % |
Всего: 90 000 | 0.044901 | 0.046035 | f1() | 0.001134 с. | 2.46 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 10 000 | 0.003816 | 0.003987 | f1() | 0.000171 с. | 4.28 % |
2 | 10 000 | 0.003781 | 0.004040 | f1() | 0.000259 с. | 6.41 % |
3 | 10 000 | 0.003772 | 0.003961 | f1() | 0.000189 с. | 4.77 % |
4 | 10 000 | 0.003773 | 0.004015 | f1() | 0.000242 с. | 6.03 % |
5 | 10 000 | 0.003806 | 0.003989 | f1() | 0.000183 с. | 4.59 % |
6 | 10 000 | 0.003801 | 0.003985 | f1() | 0.000184 с. | 4.62 % |
7 | 10 000 | 0.003792 | 0.003980 | f1() | 0.000188 с. | 4.72 % |
8 | 10 000 | 0.003795 | 0.003974 | f1() | 0.000179 с. | 4.51 % |
9 | 10 000 | 0.003873 | 0.003994 | f1() | 0.000121 с. | 3.03 % |
Всего: 90 000 | 0.034209 | 0.035925 | f1() | 0.001716 с. | 4.78 % |
Заключение
Опечален, ожидал большего. С точки зрения контроля типов данных - имеет смысл использовать, с точки зрения производительности - нет. Причём ввод скрипта в режим строгой проверки типизации declare(strict_types=1); не меняет картину. Можно и ранее было привести к типу, например необходима строка - return (string)$y;
Всё по тем же рельсам идёт: любая упаковка в классы структуры итп. тормозит скрипт; лишний код, длинные переменные и всё что заставляет компилятор удлинять сценарий чтения или выполнения - опять имеем снижение производительности..
Плюсом является то, что нет необходимости начинать программировать по новому, строгая типизация не только не даёт преимущества, но и наоборот ухудшает результат..