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

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

В одном из топиков по оптимизации мы уже касались темы доработки класса конфига ЛС. В данном топике рассмотрим ещё одну оптимизацию — заменим создание анонимной функции каждый раз при получении ключа на вызов уже созданного объекта. Изначальный код предложил пользователь 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%).

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

Скачать класс конфига с внесенными правками можно здесь.

Это кросспост из гида по движку.

49 комментариев

avatar
Спасибо.
avatar
благодарю
avatar
кто нибудь знает когда выйдет новая версия LS, извиняюсь за то что тут написал, но больше некуда)
  • Help
  • 0
avatar
а багов не будет?
если так сделать
  • Help
  • 0
avatar
багов не будет.
avatar
у меня нет багов
avatar
Закинул фикс. Чуть потеснил. Плагинов у нас не мало, эффект очень заметен. Большое спасибо :)
avatar
пожалуйста)
avatar
а если у меня шаблон скаченный с githob
avatar
а причем здесь шаблон?
avatar
я имею веду версия движка 1.0.2
avatar
там уже внесены часть правок.
avatar
значит мне не надо это делать?
avatar
скорее всего нет. если пару дней назад обновлялись, то там все правки внесены
avatar
Кстати подскажи плиз,
Если я скачал последнею версию движка LS, я смогу ее потом обновить, когда выйдет официальная версия?
avatar
Или мне нужно будет перекидывать всю базу данных на новый движок?
avatar
будет инструкция по обновлению
avatar
а если не обновиться, там же будет написано, обновление версии 1.0.1
avatar
не понял
avatar
я говорю, когда официальная версия выйдет, там при установки, будет обновить версию от 1.0.1 до 1.0.2(ну это как пример), а у меня будет 1.0.2 бето, я смогу обновить?
avatar
откуда я знаю сможете ли вы обновить или нет? раз смогли обновится с гитхаба, то почему не сможете обновить к 102 оф?
avatar
я не обновлял, я просто скачал) и установил
avatar
просто если я не смогу обновить 1.0.2 бето, то мне нужно срочно поменять ее на 1.0.1, пока проблем не набрал
avatar
хм… вы же понимали что та версия — не для публики, и в ней могут быть баги, с которыми до выхода оф. версии может быть придется бороться самому?

версия на гитхабе — только для разработчиков и тех, кто сможет самостоятельно исправить небольшие баги.

Та версия не
я не обновлял, я просто скачал) и установил
она НЕ ДЛЯ ВСЕХ.

хотя вы можете продолжать ею пользоваться. но, например, вам вправе отказать любой автор плагина в поддержке, т.к. не заявлена в нем совместимость с несуществующей публичной версией ЛС. Важно это понимать.
avatar
да я знаю но она новая, и быстрей работает чем оф версия, а плагины я не использую, я не могу решить 1 проблему, как обновлять LS с GitHub.
avatar
там есть инструкция. по работе с гитхабом
avatar
я все прочитал, и как обновлять я не понял.
avatar
там я только понял что там система как форум, один добавляет код и водит исправление, другие читают и говорят норм, а админ добавляет исправление, но как скачать только что исправленный файлы, я не знаю, там только полностью весь движок скачать можно
avatar
Плюс все разработки можно перетащить на свой аккаунт Githob, но после этого надо вручную все обновлять.
avatar
у него есть свой клиент и консольные команды. в инет полно информации на эту тему.
этот топик не об этом. хватит офтопить.
avatar
Сори.
avatar
Хороший топик, а есть возможность протестировать Closures из 5.3?
Интересует именно разница create_function и closures в работе под средой php 5.3

Если есть прирост и Максим пока сдерживается в переводе LS под 5.3 имеет ли смысл сделать условие с проверкой на версию и выбирать правильный путь создания анонимной функии, вот какой ответ хотелось бы получить.

p.s у себя уже заюзал closures, повыдерал все что не нужно, переписал конфиг что бы при загрузке конфига не происходил реплейс в значениях вида __.__ и ряд других оптимизаций
avatar
Если есть прирост и Максим пока сдерживается в переводе LS под 5.3 имеет ли смысл сделать условие с проверкой на версию и выбирать правильный путь создания анонимной функии, вот какой ответ хотелось бы получить.
в новой версии данная проблема решена по-другому — там применено решение с циклами без анонимных ф-й и замыканий.
что бы при загрузке конфига не происходил реплейс в значениях вида __.__ и ряд других оптимизаций
это не выход. а если плагины будут использовать данную конструкцию? тем более что замыкания в 5.3 не расходуют так память понапрасну, поэтому их можно использовать.
avatar
Да я видел, но когда речь идет об оптимизации под себя вид конфига, в который заходишь не так часто, не так влиятелен чем скорость работы. Я просто фреймворк гоняю, поэтому мне не нужны плагины и поэтому эти слова вынесены в p.s

По теме оптимизации есть очень старенькая статейка в которой есть пара интересных мыслишек, но только для тех кому оно надо.
avatar
По теме оптимизации есть очень старенькая статейка в которой есть пара интересных мыслишек, но только для тех кому оно надо.
видел. там ничегомало путнего, имхо. калечить конфиг и делать неудобства — не тотнаш метод.
avatar
Потому что статье уже второй год пошел, но зато вам показали инструменты для мониторинга использования памяти, а не ограниченные возможности memory_get_usage.
И hiphop использовать тоже не ваш метод, но если по темечку тюкнет…

Я все к тому что не надо сравнивать кастомные решения с рассчитанными на обычных пользователей.
avatar
возможно. я стремлюсь ускорить движок средствами, которые не меняют функциональность и оставляют работу движка как есть без изменений.
avatar
И это что то вроде заказа темы для размышления — create_function используеться не только в конфиге.
avatar
знаем
avatar
Делал небольшие замеры(время и память в кБ), 10 000 обращений к конфигу с использованием одной замены ___*___:
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)
avatar
а что второе число означает? (float(0,168))

З.Ы. create_function ещё есть в многих местах в циклах, которые тоже можно было бы отредактировать:
  1. в сущности топика в getQuestionAnswers()
  2. в классе плагина в getTemplatePathPlugin()
  3. в классе орм маппера в UpdateEntity()
  4. в модулей плагина в GetList()
  5. в модулей вьюера в BuildHeadFiles() 5 раз

и все они вызываются в циклах и не высвобождают память, естественно. итого есть 5 пунктов, где можно уменьшить потребление памяти и увеличить скорость.
avatar
Я правильно понял, что в этом файле, прикрепленным к топику есть и багфикция от Максима? т.е. тут как бы 2 изменения, багфикция Максима и изменения, описанные в этом топике, т.е. мне не надо делать в нем уже багфикцию Максима. Прошу прощения, за глупость здесь написанную, но времени щас ночь, и я плохо соображаю, поэтому в код лезть не хочется.
avatar
А можно готовый файлик? А топо ссылке нен айдено пишет?
avatar
в ЛС 1.0.2 это уже встроено в движок.
avatar
Подскажите как безболезненно обновить 1.0.1, читал ридми, понять одного не могу, файлы конфига логил и просто старые оставить или же обновить? и завноов настраивать?
avatar
с какой на какую версию? если с 1.0.1 на 1.0.2 — то перезаписывать все файлы, кроме шаблона, если вы его меняли. оставить только confi/config.local.php
avatar
Понял так и сделаю, минус получил за вопрос чудесно ))) Спасибо вам огромное!
avatar
минус не мой.
avatar
А я PSNet, вас даже и не думал обвинять! Просто улыбныло )))
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.