Самое узкое место в ЛС - увеличение производительности

Разработка под LiveStreet CMS
Ища пути ускорения движка я постоянно спотыкаюсь об класс конфига (/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;
}


и тут уже стает ясно одно — машина регулярных выражений запускается ПОСТОЯННО ДЛЯ КАЖДОГО ПОЛУЧЕНИЯ КЛЮЧА, независимо от того нужно это или нет + мелкая ошибка в регулярке. Поразмыслив, можно составить такой плагин быстрой переделки:

  1. не нужно запускать регулярку, если нечего заменять, а проверку сделать быстрыми средствами языка, вместо регулярных выражений
  2. избавить существующую регулярку от лишнего «ИЛИ» и избавить от лишнего модификатора

несложные манипуляции с кодом и получаем результат:

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;
}

Скорость выполнения от такой модификации не меняется, а потребление памяти несколько уменьшается.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.