PHP не оптимизирует...
Считается, что PHP является "интерпретатором с встроенным блоком трансляции, оптимизирующим ход интерпретации". То есть, на вход подается сценарий, PHP проверяет синтаксис и транслирует его в байт-код (внутреннее представление), который затем выполняет.
Однако, никакой оптимизации в смысле исключения ненужных операций, как умеют делать некоторые умные компиляторы C++, PHP не проводит. В доказательство выполним 2 кусочка кода, отличающихся лишь тем, что в первом, как и положено, длина строки вычисляется до цикла, в котором используется и сохраняется в переменной $len
, а во втором берётся непосредственно в теле цикла for
(это место помечено комментарием //!!!
):
<?php $n = 1e5; $s="Hello, I'm a string"; $len=strlen($s); $start = microtime(true); for ($c=0; $c<$n; $c++) { for ($i=0;$i<$len;$i++) $t=$s[$i%$len]; } $end = microtime(true); echo '<br>without strlen in for, time='.round($end-$start,4).' ms'; $start = microtime(true); for ($c=0; $c<$n; $c++) { for ($i=0;$i<strlen($s);$i++) $t=$s[$i%$len]; } //!!! $end = microtime(true); echo '<br>with strlen in for, time='.round($end-$start,4).' ms'; ?>
Вот результат выполнения:
without strlen in for, time=0.8156 ms with strlen in for, time=2.7037 ms
Разница очень чувствительная.
Ну а в C++ оптимизацией нужно уметь управлять :) Взяв для примера аналогичный код для Visual C++, вставим его в пустой проект:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <time.h> using namespace std; int main() { long t1,t2; double n = 1e8, c; char *s="Hello, I'm a string"; int len=strlen(s),i; char t; t1 = clock(); for (long c=0; c<n; c++) { for (i=0;i<len;i++) t=s[i%len]; } t2 = clock(); cout << t2 - t1 << " ms" << endl; t1 = clock(); for (long c=0; c<n; c++) { for (i=0;i<strlen(s);i++) t=s[i%len]; //!!! } t2 = clock(); cout << t2 - t1 << " ms" << endl; cin.sync(); cin.get(); return 0; }
В верхней панели инструментов Стандартная выберем из списка Конфигурации решения = Release вместо Debug, а в меню Проект - Свойства проекта - C/C++ - Оптимизация выберем значение Максимальная скорость (/O2). Я получил вот что на нескольких запусках:
109 ms 110 ms
То есть, в приведённом коде с 10 млн циклов каких-либо заметных расхождений нет, нет их и на миллиарде шагов внешнего цикла. Без оптимизации и в конфигурации отладки Debug, конечно же, результаты были бы аналогичны PHP.
19.10.2015, 16:01 [6064 просмотра]