>Привет, на ЛОРе наткнулся на твои комментарии по поводу модернизации smarty - замены substr-ов на preg>Не мог бы ты рассказать об этом по подробнее? Или у тебя случайно нет статьи/твоей версии smarty в свободном доступе?
Рассказываю

В PHP очень тормозной substr. Как в прямом виде, так и в виде $str{$pos}.
После того, как я отбенчил Smarty, выяснилось, что там основную часть времени занимают вызовы susbtr().
Дальше я тупо отыскал все вхождения substr и поменял, где это возможно, на альтернативы. Или не тупо, а самые тормозящие... Не помню уже.
Самое простое. Сравнения, вида:
if($path{0} == '/')
меняем на
if(preg_match('!^/!', $path))
или
if(substr($file, -4) == '.php')
меняем на
if(preg_match('!\.php$!', $file))
Подобных примеров там немало.
Местами можно было и более эффективно менять. Что-то в духе... ладно, пойду пороюсь

Вот реальные примеры:
if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*')
замена:
if(preg_match("!^\*.+\*$!", $template_tag))code php
if (strlen($compiled_content) && (substr($compiled_content, -1) == "\n") {
$compiled_content = substr($compiled_content, 0, -1);
}
замена:
$compiled_content = preg_replace("!\n$!", "", $compiled_content);
(хотя, возможно, что можно и тупо
$compiled_content = rtrim($compiled_content) - но лениво разбираться, вдруг там пробелы справа где-то значмиые?)
if (substr($tag_command, 0, 1)=='/')
замена на
if (preg_match("!^/!", $tag_command))
более хитрая замена:
code php
$_var_ref = $var_expr;
else
$_var_ref = substr($var_expr, 1);
на
$_var_ref = preg_replace("!^\D!", "", $var_expr);
и т.д...
Если мне память не изменяет, таким образом я добился где-то пятикратного ускорения работы шаблонизатора.
К сожалению, такой правке подвергалась только версия 2.6.18, до более свежих руки не доходят

А отослать патчи разработчикам - ломает. Не помню ещё ни одного случая, чтобы мои патчи на что-то принимались кем-то. Может, мой «английский» вызывает слишком много недоверия