PHP. Что быстрее: (int) или IntVal() ?

Иногда встречаю в одном программном коде разные способы приведения типов. А именно: (int) и IntVal(). Что же лучше использовать? Один из главных моих критериев работы программного кода — это быстродействие. От него и будет зависеть выбор функций. Поэтому оценим что же выполняется быстрее: (int) или IntVal().

Сначала зададим то, что будем приводить:

$a = ‘ 1 ‘;

Встречайте! Это единица, записанная как текст. С пробелом до неё и после неё. После приведения типов она должна стать настоящим числом.

Поставим приведение типов в цикл:

$time_start = microtime(true);

(int)$a;

$time_end = microtime(true);

Разница между этими временными метками будет соответствовать времени выполнения (int)$a. Чтобы результат не был случайным, поставим этот код в цикл. К примеру, 1 000 000 повторений даст более-менее среднюю величину времени приведения типа. То же самое сделаем с IntVal($a)

$time_start = microtime(true);

IntVal($a);

$time_end = microtime(true);

Поделим среднее время выполнения IntVal($a) на (int)$a. И получаем, что (int)$a примерно в 1.05-1.5* раза быстрее, чем IntVal($a).

* Простите меня грешного! С расчётом среднеквадратичного отклонения не заморачивался. Считал только среднее.

Чистота эксперимента

Проверку делаю на сервере с установленным Apache, PHP как модуль (v. 7.0.14) и BitrixEnv (v. 7.0.0). Битрикс окружение идёт со средствами ускорения PHP (OpCache, APCu). Поэтому результат можно назвать нечистым. Но применимым к серверам на BitrixEnv.

Ещё меня удивило то, что каждый 10-20 цикл IntVal() проигрывала (int) по скорости не просто 5 — 50 %, а все 5 000 %. Наверное, ускорители тянут за уши IntVal(), чтобы она быстрее работала, но обновляют состояние каждый 10-20 циклов. Отсюда такое сильное выпадение некоторых результатов.

Чтобы провести чистый эксперимент, необходимо отключить все сторонние ускорители. Но подозреваю, что результат будет идентичный. Поэтому мне лень. Ведь сервер будет работать в том состоянии, в котором он находится. И вряд ли я когда-нибудь буду отключать ускорители.

Вывод

(int) до 50% быстрее, чем IntVal().

IntVal() стоит использовать только ради второго параметра. Который хз что делает и никто им не пользуется 😉



2017-01-08T13:42:45
Интернет