Профессиональное программирование на PHP

Страница 448 из 591


Примеры эталонных тестов 465

жения, которые тратят значительную часть времени выполнения на вызовы substr вследствие неудачной реализации синтаксического разбора строк. Естественной заменой substr в данном контексте является функция strncmp, сравнивающая первые псимволов двух строк.

Например, можно использовать следующий код для сравнения функций substr и strncmp при выборе SCRIPT_-nepeMeHHbix из массива $_SERVER:

function substr_match($arr) {

foreach ($arr as $key => $val) {

if (substr($key, 0, 5) == 'SCRIPT_') { $retval[$key] =$val;

}

}

}

function strncmp_match($arr) { foreach ($arr as $key => $val) { if(!strncmp($key, "SCRIPT_", 5)) { $retval[$key] =$val;

}

}

}

require "MyBench.inc";

foreach(array(1substr_match', 1strncmp_match') as $func) {

$bm = new MyBench;

$bm->run(1000, $func, $_SERVER);

$result = $bm->get(); ^ printf("$func %0.6f\n", $result ['mean']);

Код возвращает следующий результат:

substr_match 0.000482

strncmp_match 0.0004 06

Прирост скорости в 20% достаточно значителен, особенно в часто выполняемом коде.

Почему функция substr так проигрывает в скорости strncmp? substr должна выделить память и записать свое возвращаемое значение, а затем выполнить сравнение, тогда как strncmp просто посимвольно сравнивает строки. Несмотря на то что РНР скрывает все подробности управления памятью, затраты на выделение памяти остаются. В ходе множества итераций затраты на выделение 6 байт для результата суммируются.

Макроподстановка

В данном примере эталонное тестирование используется для оптимизации нестандартного макроэкспандера. Реализация собственного макроязыка может оказаться полезной в таких случаях, как обеспечение ограниченных средств сценариев в системе управления содержимым или в системе почтовых шаблонов. Можно использовать шаблоны в подобном тексте:




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006