Самое узкое место в ЛС - увеличение производительности
Ища пути ускорения движка я постоянно спотыкаюсь об класс конфига (/engine/lib/internal/ConfigSimple/Config.class.php), а именно — меня беспокоит авто замена ключей в конфиге. Такой код мы можем найти в дистрибутиве:
и тут уже стает ясно одно — машина регулярных выражений запускается ПОСТОЯННО ДЛЯ КАЖДОГО ПОЛУЧЕНИЯ КЛЮЧА, независимо от того нужно это или нет + мелкая ошибка в регулярке. Поразмыслив, можно составить такой плагин быстрой переделки:
несложные манипуляции с кодом и получаем результат:
Скорость выполнения от такой модификации не меняется, а потребление памяти несколько уменьшается.
З.Ы. это кросспост отсюда.
static public function KeyReplace($cfg,$sInstance=self::DEFAULT_CONFIG_INSTANCE) {
if(is_array($cfg)) {
foreach($cfg as $k=>$v) {
$k_replaced = self::KeyReplace($k, $sInstance);
if($k==$k_replaced) {
$cfg[$k] = self::KeyReplace($v,$sInstance);
} else {
$cfg[$k_replaced] = self::KeyReplace($v,$sInstance);
unset($cfg[$k]);
}
}
} else {
if(preg_match('~___([\S|\.|]+)___~Ui',$cfg))
$cfg = preg_replace_callback(
'~___([\S|\.]+)___~Ui',
create_function('$value','return Config::Get($value[1],"'.$sInstance.'");'),
$cfg
);
}
return $cfg;
}
и тут уже стает ясно одно — машина регулярных выражений запускается ПОСТОЯННО ДЛЯ КАЖДОГО ПОЛУЧЕНИЯ КЛЮЧА, независимо от того нужно это или нет + мелкая ошибка в регулярке. Поразмыслив, можно составить такой плагин быстрой переделки:
- не нужно запускать регулярку, если нечего заменять, а проверку сделать быстрыми средствами языка, вместо регулярных выражений
- избавить существующую регулярку от лишнего «ИЛИ» и избавить от лишнего модификатора
несложные манипуляции с кодом и получаем результат:
static public function KeyReplace($cfg,$sInstance=self::DEFAULT_CONFIG_INSTANCE) {
if(is_array($cfg)) {
foreach($cfg as $k=>$v) {
$k_replaced = self::KeyReplace($k, $sInstance);
if($k==$k_replaced) {
$cfg[$k] = self::KeyReplace($v,$sInstance);
} else {
$cfg[$k_replaced] = self::KeyReplace($v,$sInstance);
unset($cfg[$k]);
}
}
} else {
if (strpos ($cfg, '___') !== false) {
$cfg = preg_replace_callback (
'~___([\S|\.]+)___~U',
create_function ('$value', 'return Config::Get($value[1],"'.$sInstance.'");'),
$cfg
);
}
}
return $cfg;
}
Скорость выполнения от такой модификации не меняется, а потребление памяти несколько уменьшается.
З.Ы. это кросспост отсюда.
36 комментариев
кстати там в конфиге есть приведение типов в цикле, например:
думаю что можно было бы вынести:
нужно время только для теста всего этого…
Из за этого в ОРМ был баг с сжиранием памяти
да, прироста по скорости почти нет, а память жрет меньше
Зло, зло! :)
если Максим согласится — можно перелопатить большую кучу кода.
это могло бы уменьшить расход памяти.
?
в таком случае будет обработан только первый ключ
ключ i в регекспе не нужен.
На чистой ЛС 1.0.1 в условиях теста память стало жрать на пол мегабайте меньше.
Правда поиском в движку можно с легкостью найти ещё вызовы лямбда функций в циклах. Вот бы и их заменить…
хотелось бы их все 102 вместить так чтобы общий прирост производительности заставил рот открыться.
ну и исправления безопасности.
будет самая быстрая и стабильная версия)