Иногда встречаю в одном программном коде разные способы приведения типов. А именно: (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() стоит использовать только ради второго параметра. Который хз что делает и никто им не пользуется 😉