Оптимизация ЛС, часть 3
Топик залежался в черновиках, и хотя сегодня Максим уже сделал багфикс, я все же опубликую этот топик в общеобразовательных целях.
В одном из топиков по оптимизации мы уже касались темы доработки класса конфига ЛС. В данном топике рассмотрим ещё одну оптимизацию — заменим создание анонимной функции каждый раз при получении ключа на вызов уже созданного объекта. Изначальный код предложил пользователь empirik и данный код является небольшой его модификацией + результаты тестов.
Приступим.
Загрузка модулей: 0.14 сек.
Полное время: 0.45 сек.
Пиковое использование памяти: 10337 KB
Использование памяти: 10184.8 KB
Этапы 2 и 3 описывать не буду т.к. описание в вышеуказанных топиках уже есть.
В /engine/lib/internal/ConfigSimple/Config.class.php добавим в класс переменную в которой будем содержать сущности класса конфига:
добавим метод для создания одной анонимной функции на сущность конфига, которую будем сохранять в ранее созданном массиве:
Дополним метод KeyReplace так:
Загрузка модулей: 0.133 сек.
Полное время: 0.424 сек.
Пиковое использование памяти: 9748.5 KB
Использование памяти: 9664.7 KB
Наблюдаем картину незначительного увеличения быстродействия на 0,026 сек (5,7%), а также уменьшения потребления памяти в пол мегабайта (на 5,7%).
Как и говорилось в прошлом топике — это только на чистой ЛС, при использовании плагинов данный результат может стать ещё более ощутимым.
Скачать класс конфига с внесенными правками можно здесь.
Это кросспост из гида по движку.
В одном из топиков по оптимизации мы уже касались темы доработки класса конфига ЛС. В данном топике рассмотрим ещё одну оптимизацию — заменим создание анонимной функции каждый раз при получении ключа на вызов уже созданного объекта. Изначальный код предложил пользователь empirik и данный код является небольшой его модификацией + результаты тестов.
Итак, план работ таков:
- Замерим используемую память и полное время выполнения стандартной чистой поставки ЛС 1.0.1 с выключенными модулями анонимной отправки данных (LS), кеша (Cache) и отключенными плагинами. Замеры будем производить обновлением главной страницы
- Модифицируем шаблон для вывода используемой памяти, данные действия описаны в этом топике по оптимизации.
- Применим предыдущую оптимизацию конфига.
- Внесем правки в код класса конфига
- Замеряем результаты
- Подведем итоги
Приступим.
1. Средние значения из коробки
Загрузка модулей: 0.14 сек.
Полное время: 0.45 сек.
Пиковое использование памяти: 10337 KB
Использование памяти: 10184.8 KB
Этапы 2 и 3 описывать не буду т.к. описание в вышеуказанных топиках уже есть.
4. Модифицируем конфиг
В /engine/lib/internal/ConfigSimple/Config.class.php добавим в класс переменную в которой будем содержать сущности класса конфига:
static private $aConfigClosure = array ();
добавим метод для создания одной анонимной функции на сущность конфига, которую будем сохранять в ранее созданном массиве:
static private function getClosureForConfig ($sInstance = self::DEFAULT_CONFIG_INSTANCE) {
if(!array_key_exists ($sInstance, self::$aConfigClosure)) {
self::$aConfigClosure [$sInstance] = create_function ('$value', 'return Config::Get ($value[1], "' . $sInstance . '");');
}
return self::$aConfigClosure [$sInstance];
}
Дополним метод KeyReplace так:
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) {
$oClosure = self::getClosureForConfig ($sInstance);
$cfg = preg_replace_callback (
'~___([\S|\.]+)___~U',
$oClosure,
$cfg
);
}
}
return $cfg;
}
5. Замеряем результат
Загрузка модулей: 0.133 сек.
Полное время: 0.424 сек.
Пиковое использование памяти: 9748.5 KB
Использование памяти: 9664.7 KB
6. Итоги работ
Наблюдаем картину незначительного увеличения быстродействия на 0,026 сек (5,7%), а также уменьшения потребления памяти в пол мегабайта (на 5,7%).
Как и говорилось в прошлом топике — это только на чистой ЛС, при использовании плагинов данный результат может стать ещё более ощутимым.
Скачать класс конфига с внесенными правками можно здесь.
Это кросспост из гида по движку.
49 комментариев
если так сделать
Если я скачал последнею версию движка LS, я смогу ее потом обновить, когда выйдет официальная версия?
версия на гитхабе — только для разработчиков и тех, кто сможет самостоятельно исправить небольшие баги.
Та версия не
она НЕ ДЛЯ ВСЕХ.
хотя вы можете продолжать ею пользоваться. но, например, вам вправе отказать любой автор плагина в поддержке, т.к. не заявлена в нем совместимость с несуществующей публичной версией ЛС. Важно это понимать.
этот топик не об этом. хватит офтопить.
Интересует именно разница create_function и closures в работе под средой php 5.3
Если есть прирост и Максим пока сдерживается в переводе LS под 5.3 имеет ли смысл сделать условие с проверкой на версию и выбирать правильный путь создания анонимной функии, вот какой ответ хотелось бы получить.
p.s у себя уже заюзал closures, повыдерал все что не нужно, переписал конфиг что бы при загрузке конфига не происходил реплейс в значениях вида __.__ и ряд других оптимизаций
это не выход. а если плагины будут использовать данную конструкцию? тем более что замыкания в 5.3 не расходуют так память понапрасну, поэтому их можно использовать.
По теме оптимизации есть очень старенькая статейка в которой есть пара интересных мыслишек, но только для тех кому оно надо.
ничегомало путнего, имхо. калечить конфиг и делать неудобства — нетотнаш метод.И hiphop использовать тоже не ваш метод, но если по темечку тюкнет…
Я все к тому что не надо сравнивать кастомные решения с рассчитанными на обычных пользователей.
float(0,878) float(9574,715) — 1.0.1
float(0,456) float(0,168) — closures
float(0,548) float(0,168) — static method
float(0,465) float(0,129) — 1.0.2 (github)
З.Ы. create_function ещё есть в многих местах в циклах, которые тоже можно было бы отредактировать:
и все они вызываются в циклах и не высвобождают память, естественно. итого есть 5 пунктов, где можно уменьшить потребление памяти и увеличить скорость.