ONK
Пассивист PHPСluba
Измерение реального времени парсировки имён переменных внутри строк.
Привёл от нечего делать серию тестов, результаты как мне кажется интересны.
Сначала остановлюсь на методике тестирования, Чтобы потом никто, не аргументировано, не говорил что методика неправильная... Если считаете неправильной, то что конкретно?..
Если стоит вопрос об измерении времени парсировки переменных в закавыченных двойными кавычками строках, то именно это и надо измерять. А не пытаться имитировать реальное приложение. Должен быть получен максимально "чистый" результат, из которого каждый сам сделает выводы..
Для получения чистого результата, предварительно запускаем калибровочный цикл с простейшим действием присваивания одной переменной строкового значения в 1 символ из другой переменной. Время исполнения 100000 итераций этого цикла записываем в калибровочную переменную, для последующего вычисления "чистого" времени.
PHP 4.1
Apache 1.3...
W2k
На моей машине время исполнения калибровочного цикла 127милисекунд
После этого на основе этого - же цикла создаём тестовые циклы с различными вариантами тестирования работы переменных и строк:
1. Измерение скорости конкатенации одной дополнительной переменной:
Результат - чистое время извлечения значения из одной переменной и конкатенации к чему-то составляет 63милисек.
Конкатенация двух переменных (дополнительно ещё и $b) происходит за 119милисекунд.
Что подтверждает правильность методики тестирования.
2. Измерение скорости парсировки и конкатенации короткой строки, в которой находится одна переменная:
Результат - Чистое время парсировки и конкатенации составляет 266милисекунд. После следующего теста можно вычислить условное время парсировки переменной в строке.
3. Измерение скорости простой конкатенации строки и переменной.
Результат - Общее чистое время конкатенации строки и переменной составляет 103милисекунды.
Из этого следует несколько выводов:
Чистое время парсировки переменной в строке из 8 символов составляет 166милисекунд.
Чистое время конкатенации строки к чему-то составляет ~40милисекунд.
Удивительно, но тест подтвердил последнюю прикидку с 40милисекундами. (Полный исходник теста в конце темы.)
4.Измерение чистого времени парсировки и конкатенации строки из 16символов и с одной переменной.
Результат - Чистое время парсироваки и конкатенации 286 -343 (в зависимости от того с какой стороны от переменной добавлять дополнительные знаки в строку, видимо, связано с алгоритмом поиска). Чистое время парсировки 186 - 240 миллисекунд. (240 - 166 = ~ 60 интересная цифра. но не о чём не говорит).
5 Измерение чистого времени конкатенации строки с двумя переменными внутри
Результат - Чистое время парсировки и конкатенации 585милисекунд.
6. Измерение чистого времени конкатенации переменных и строк, аналогичных пункту 5, но без парсировки.
Результат Чистое время 245 ~= (60 + 60 + 40 + 40)
Помимо всех вышеприведённых тестов я провёл ещё серию тестов, из которой понял алгоритм поиска переменных внутри строки. Он таков - ПХП анализирует строку на наличие знака "$" если знак обнаружен, запускает процедура парсирвки строки на фрагменты, разделённые знаками (в том числе и пробела, но не буквы и не цифры). Все фрагменты строки, разделённые знаками парсируются на наличие в них знака "$", если он есть, то именем переменной считается участок строки от знака $ до конца текущего фрагмента. Это подтверждает также то, что возникают необъявленные переменные длинной именно до конца фрагмента, хотя в глобальной видимости есть переменная с более коротким именем, входящим в этот фрагмент сразу после знака $.
Этот алгоритм явно не оптимален, эффективнее было бы, найдя в строке символ $ дойти до знака ограничивающего фрагмент, посчитать выделенный участок строки именем переменной и поискать её среди объявленных..., затем поискать в оставшейся части строки ещё один символ $, если есть, - рекурсивный вызов если нет, - выход из парсировки.
Получилась целая научная работа
Мои выводы:
Использование переменных внутри "строк" оправдано только при составлении SQL запросов к базе данных. Читабельность запроса повышается, а их количество в нормальных приложениях редко превышает 2-х десятков.
Привёл от нечего делать серию тестов, результаты как мне кажется интересны.
Сначала остановлюсь на методике тестирования, Чтобы потом никто, не аргументировано, не говорил что методика неправильная... Если считаете неправильной, то что конкретно?..
Если стоит вопрос об измерении времени парсировки переменных в закавыченных двойными кавычками строках, то именно это и надо измерять. А не пытаться имитировать реальное приложение. Должен быть получен максимально "чистый" результат, из которого каждый сам сделает выводы..
Для получения чистого результата, предварительно запускаем калибровочный цикл с простейшим действием присваивания одной переменной строкового значения в 1 символ из другой переменной. Время исполнения 100000 итераций этого цикла записываем в калибровочную переменную, для последующего вычисления "чистого" времени.
PHP 4.1
Apache 1.3...
W2k
PHP:
$a = 'thyyjfnjjdfgtnbvk';
$b = 'kyiiyijgnmvbdgft';
$c = 'a';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c;
}
$calibr = $mark10->current_time();
После этого на основе этого - же цикла создаём тестовые циклы с различными вариантами тестирования работы переменных и строк:
1. Измерение скорости конкатенации одной дополнительной переменной:
PHP:
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c.$a;
}
echo $mark10->current_time()-$calibr,'<br>';
Конкатенация двух переменных (дополнительно ещё и $b) происходит за 119милисекунд.
Что подтверждает правильность методики тестирования.
2. Измерение скорости парсировки и конкатенации короткой строки, в которой находится одна переменная:
PHP:
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder$a";
}
echo $mark10->current_time()-$calibr,'<br>';
3. Измерение скорости простой конкатенации строки и переменной.
PHP:
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder".$a;
}
echo $mark10->current_time()-$calibr,'<br>';
Из этого следует несколько выводов:
Чистое время парсировки переменной в строке из 8 символов составляет 166милисекунд.
Чистое время конкатенации строки к чему-то составляет ~40милисекунд.
Удивительно, но тест подтвердил последнюю прикидку с 40милисекундами. (Полный исходник теста в конце темы.)
4.Измерение чистого времени парсировки и конкатенации строки из 16символов и с одной переменной.
PHP:
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgderfthujbkb$a";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder$a'fgtfgth";
}
echo $mark10->current_time()-$calibr,'<br>';
5 Измерение чистого времени конкатенации строки с двумя переменными внутри
PHP:
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr$a%fhdtu truyrety$b&ytre";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
6. Измерение чистого времени конкатенации переменных и строк, аналогичных пункту 5, но без парсировки.
PHP:
Помимо всех вышеприведённых тестов я провёл ещё серию тестов, из которой понял алгоритм поиска переменных внутри строки. Он таков - ПХП анализирует строку на наличие знака "$" если знак обнаружен, запускает процедура парсирвки строки на фрагменты, разделённые знаками (в том числе и пробела, но не буквы и не цифры). Все фрагменты строки, разделённые знаками парсируются на наличие в них знака "$", если он есть, то именем переменной считается участок строки от знака $ до конца текущего фрагмента. Это подтверждает также то, что возникают необъявленные переменные длинной именно до конца фрагмента, хотя в глобальной видимости есть переменная с более коротким именем, входящим в этот фрагмент сразу после знака $.
Этот алгоритм явно не оптимален, эффективнее было бы, найдя в строке символ $ дойти до знака ограничивающего фрагмент, посчитать выделенный участок строки именем переменной и поискать её среди объявленных..., затем поискать в оставшейся части строки ещё один символ $, если есть, - рекурсивный вызов если нет, - выход из парсировки.
Получилась целая научная работа
Мои выводы:
Использование переменных внутри "строк" оправдано только при составлении SQL запросов к базе данных. Читабельность запроса повышается, а их количество в нормальных приложениях редко превышает 2-х десятков.
PHP:
<?php
class onk_Time_marker{
var $s_m;
function onk_Time_marker(){
$prom = explode(" ",substr(microtime(),2));
$this->s_m = $prom[1].".".$prom[0];
}
function start(){
$prom = explode(" ",substr(microtime(),2));
$this->s_m = $prom[1].".".$prom[0];
}
function current_time(){
$prom = explode(" ",substr(microtime(),2));
$m_s = $prom[1].".".$prom[0];
$time = $m_s - $this->s_m;
return round($time,11);
}
}
$mark10 = new onk_Time_marker();
$a = 'thyyjfnjjdfgtnbvk';
$b = 'kyiiyijgnmvbdgft';
$c = 'a';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c;
}
$calibr = $mark10->current_time();
echo 'Калибровка поправки ',$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c.$a;
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c.$a.$b;
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder$a";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder".$a;
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgderfthujbkb$a";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."dsgder$a'fgtfgth";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr$a%fhdtu truyrety$b&ytre";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr".$a."%fhdtu truyrety".$b."&ytre";
}
echo $mark10->current_time()-$calibr,'<br>';
//Анализ алгоритма парсировки строк.
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr$a hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr$a hhhhh hhhhhhh hhhhhhh hhhhhh hhhhh hhhhh hh hhhhhh";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr hhh^hhhhh^^hhhhh^hhhhh^hhh^hhhh^hhhh^hhhh^hhh^hhhh hbui ftyi yy gyyt 6 5 5gdf%gkuygku*huyg&bhjv*jhbjb#jkghuy#jkbvhu@jhgkj!hvgh(njbku)";
}
echo $mark10->current_time()-$calibr,'<br>';
$mark10->start();
for($i=0;$i<100000;$i++){
$m = $c."ertdfgsrtyr$a hhh^hhhhh^^hhhhh^hhhhh^hhh^hhhh^hhhh^hhhh^hhh^hhhh hbui ftyi yy gyyt 6 5 5gdf%gkuygku*huyg&bhjv*jhbjb#jkghuy#jkbvhu@jhgkj!hvgh(njbku)";
}
echo $mark10->current_time()-$calibr,'<br>';
?>