Важно не то, на что ты смотришь, а то, что ты видишь. — Х.Д. Торо

Большинство разговоров о производительности в тот или иной момент доходят до темы кэширования. И по уважительной причине. Кэширование помогает скрыть одну из самых больших неэффективностей производительности во многих системах. Верно, скрыть, а не исправить. Будь то локальное хранилище данных, предварительно рассчитанный набор данных или временное хранилище для уменьшения количества запросов на стороне сервера, все эти методы повышают производительность за счет ограничения частоты дорогостоящих операций. Опять же, важно помнить, что кэш не повышает производительность самих операций, а скорее уменьшает/задерживает/устраняет необходимость выполнения этих операций.

Не поймите меня неправильно, важно ограничить количество дорогостоящих подключений или операций, поэтому кэширование является распространенным компонентом в большинстве современных архитектур. Вот почему меня несколько удивляет, что другие передовые методы, которые достигают тех же целей, но не подпадают под традиционное определение «кэширования», часто игнорируются. В частности, я говорю о кэшировании области видимости™.

Что такое «кэширование области видимости»™?

Scope caching™ — это то, что большинство из вас, знакомых с программированием, вероятно, уже используют в той или иной мере. Простейшим примером кэширования области действия является базовый принцип программирования не помещать вычислительные операции в цикл, где это возможно. Выполнение операций вне цикла, сохранение их в переменной и использование переменной результата в следующем цикле/пути кода — это пример повторного использования предварительно вычисленного значения. Что, по сути, и пытается выполнить кэширование.

Сколько областей применения?

Многие. Столько областей, сколько есть в языке программирования, и даже больше. Вот почему важно уделить время и понять необходимый объем требований к кешу.

Например, глобальная область видимости переменной считается плохой практикой. Однако при работе с веб-языком глобальной областью действия может быть поток веб-сервера или сеанс веб-сервера. Загрузить что-то один раз и сохранить это на всю жизнь этой области для всех пользователей может (и должно) быть вполне приемлемым решением. Хорошим примером являются предварительно сгенерированные константы. Если вы (как и многие) храните свои страны и штаты в базе данных, загружая их во время запуска веб-сервера и сохраняя их в глобальной памяти, вместо того, чтобы обращаться к базе данных при каждом запросе, это форма кэширования области действия.

Говоря о сети, REQUEST и SESSION, вероятно, являются двумя наиболее распространенными областями действия, которыми можно воспользоваться.

Рассмотрим функцию, которая находится поверх службы аутентификации и возвращает текущий пользовательский объект. Это очень просто. Полезный. Широко используемый.

public function currentUser() {
  var currentUser = classes.getCurrentUser();
  return currentUser;
}

Множество различных модулей и служб используют его для проверки контроля доступа пользователя, настроек и т. д. И поэтому он вызывается как минимум 14 раз за загрузку страницы. 14 запросов к вашей базе данных/кэшу/пользовательской службе по сети для получения одной и той же информации на одной странице. Сервисный дизайн ftw.

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

public function currentUser() {
  if ( !isDefined("REQUEST.currentUser") ) {
    REQUEST.currentUser = classes.getCurrentUser();
  }
  return REQUEST.currentUser;
}

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

Кэширование области™!

Приведенный выше список областей действия не является исчерпывающим, хотя он (надеюсь) дает хорошую иллюстрацию разнообразия уровней области действия и методов ограничения операций. Помните, если вам нужно запросить информацию более одного раза, обязательно кэшируйте ответ. (Эй, это рифмуется!)