Voyager2K
Новичок
Скорость скрипта.
Дело такое... Есть строка $line, нужно разбить ее на массив ключ-значение.
Ниже приведен код, где в первом варианте я регулярками(причем для каждого значения отдельно регулярку запускаю) разбиваю.
Во втором варианте, думал сравнить насколько быстрей получится вручную посимвольно пробежаться по строке и выцепить необходимые значения. Вот только не успел, сделал только дабы цикл опсимвольно пробегал строку и выводил ее... и уже тут у меня полезли глаза на лоб(см. вывод скрипта т.е. время). Каким образом куча регулярок пробегают обрабатывают строку и формируют массив быстрее, нежели просто посимвольной пройти и вывести черех echo ? Или я сейчас ничего не соображаю ночью ?
Какие результаты у меня выдает:
Дело такое... Есть строка $line, нужно разбить ее на массив ключ-значение.
Ниже приведен код, где в первом варианте я регулярками(причем для каждого значения отдельно регулярку запускаю) разбиваю.
Во втором варианте, думал сравнить насколько быстрей получится вручную посимвольно пробежаться по строке и выцепить необходимые значения. Вот только не успел, сделал только дабы цикл опсимвольно пробегал строку и выводил ее... и уже тут у меня полезли глаза на лоб(см. вывод скрипта т.е. время). Каким образом куча регулярок пробегают обрабатывают строку и формируют массив быстрее, нежели просто посимвольной пройти и вывести черех echo ? Или я сейчас ничего не соображаю ночью ?
PHP:
class CTimer
{
var $s;
var $p = 0;
function start()
{
$this->s = $this->getmicrotime();
}
function pause()
{
$this->p = $this->getmicrotime();
}
function unpause()
{
$this->s += ($this->getmicrotime() - $this->p);
$this->p = 0;
}
function fetch($decimalPlaces = 3)
{
return round(($this->getmicrotime() - $this->s), $decimalPlaces);
}
function getmicrotime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
}
echo 'begin<hr>';
$tm = new CTimer();
$line = '[DATE]=2006-02-16 07:31:01 [IP]=122.0.0.1 [TO]=http://wk_site1.loc/index.php?page=2 [FROM]=http://wk_site1.loc/index.php?page=2 [BROWSER]=Microsoft Internet Explorer [COOKIE]=true [RESOLUTION]=1400x1050';
///////////////////////////////////// ВАРИАНТ 1
$tm->start();
$res = array();
preg_match('/\[DATE\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['DATE'] = $r[1];
preg_match('/\[IP\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['IP'] = $r[1];
preg_match('/\[TO\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['TO'] = $r[1];
preg_match('/\[FROM\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['FROM'] = $r[1];
preg_match('/\[BROWSER\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['BROWSER'] = $r[1];
preg_match('/\[COOKIE\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['COOKIE'] = $r[1];
preg_match('/\[RESOLUTION\]=(.+?)((?=$)|(\[[a-z0-9]+\]=))/i', $line, $r);
$res['RESOLUTION'] = $r[1];
$rt = $tm->fetch(9);
print_r($res);
echo '<br><H2> TIME '.$rt.'</H2><hr>';
//////////////////////////////////////////// ВАРИАНТ 2
$tm->start();
$length = strlen($line);
for ($i = 0; $i < $length; $i++)
{
echo $line[$i];
}
$rt = $tm->fetch(9);
//print_r($res);
echo '<br><H2> TIME '.$rt.'</H2><hr>';
Какие результаты у меня выдает:
begin
--------------------------------------------------------------------------------
Array ( [DATE] => 2006-02-16 07:31:01 [IP] => 122.0.0.1 [TO] => http://wk_site1.loc/index.php?page=2 [FROM] => http://wk_site1.loc/index.php?page=2 [BROWSER] => Microsoft Internet Explorer [COOKIE] => true [RESOLUTION] => 1400x1050 )
TIME 0.000124931
--------------------------------------------------------------------------------
[DATE]=2006-02-16 07:31:01 [IP]=122.0.0.1 [TO]=http://wk_site1.loc/index.php?page=2 [FROM]=http://wk_site1.loc/index.php?page=2 [BROWSER]=Microsoft Internet Explorer [COOKIE]=true [RESOLUTION]=1400x1050
TIME 0.000168085

