Оптимизация ЛС, часть 3

Разработка под LiveStreet CMS
В одном из топиков по оптимизации мы уже касались темы доработки класса конфига ЛС. В данном топике рассмотрим ещё одну оптимизацию — заменим создание анонимной функции каждый раз при получении ключа на вызов уже созданного объекта. Изначальный код предложил пользователь empirik и данный код является небольшой его модификацией.

Итак, план работ таков:

  1. Замерим используемую память и полное время выполнения стандартной чистой поставки ЛС 1.0.1 с выключенными модулями анонимной отправки данных (LS), кеша (Cache) и отключенными плагинами. Замеры будем производить обновлением главной страницы
  2. Модифицируем шаблон для вывода используемой памяти, данные действия описаны в этом топике по оптимизации.
  3. Применим предыдущую оптимизацию конфига.
  4. Внесем правки в код класса конфига
  5. Замеряем результаты
  6. Подведем итоги

Приступим.

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%).

Как и говорилось в прошлом топике — это только на чистой ЛС, при использовании плагинов данный результат может стать ещё более ощутимым.

Новый класс конфига с схожими правками можно уже интегрирован в движок.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.