БлогNot. PHP не оптимизирует...

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 [6020 просмотров]


теги: c++ php время studio тест

К этой статье пока нет комментариев, Ваш будет первым