В общем случае кэширование и запоминание имеют смысл, когда:
- Получение результата (или, по крайней мере, может быть) с высокой задержкой или иным образом дороже, чем затраты, вызванные самим кэшированием.
- Результаты имеют шаблон поиска, в котором будут частые вызовы с одинаковыми входными данными для функции (то есть не только аргументы, но и любой экземпляр, статические и другие данные, влияющие на результат).
- В коде, к которому обращается данный код, уже не существует механизма кэширования, который делает это ненужным.
- В коде не будет другого механизма кэширования, вызывающего соответствующий код, который делаетв этом нет необходимости (почему почти никогда не имеет смысла запоминать
GetHashCode()
в этом методе, несмотря на то, что люди часто испытывают искушение, когда реализация является относительно дорогой). - Невозможно стать устаревшим, вряд ли станет устаревшим, покакэш загружен, неважно, устарел ли он или нетsy для обнаружения.
В некоторых случаях каждый вариант использования компонента будет соответствовать всем этим.Есть много, где они не будут.Например, если компонент кэширует результаты, но никогда не вызывается дважды с одними и теми же входными данными конкретным клиентским компонентом, то такое кэширование - это просто трата, которая негативно влияет на производительность (может быть незначительной, а может быть серьезной).1017 * Чаще всего клиентскому коду имеет больше смысла выбирать политику кэширования, которая бы ему подходила.Кроме того, часто будет проще настроить конкретное использование в данный момент перед лицом реальных данных, чем в компоненте (поскольку реальные данные, с которыми он столкнется, могут значительно различаться от использования к использованию).
Еще сложнее узнать, какая степень застоя может быть приемлемой.Как правило, компонент должен предполагать, что от него требуется 100% свежесть, в то время как клиентский компонент может знать, что определенная степень устаревания будет хорошей.
С другой стороны, это может быть проще для компонентадля получения информации, полезной для кеша.В этих случаях компоненты могут работать рука об руку, хотя это гораздо сложнее (примером может служить механизм If-Modified-Since, используемый веб-сервисами RESTful, где сервер может указать, что клиент может безопасно использовать информацию, которую он кэшировал).
Кроме того, компонент может иметь настраиваемую политику кэширования.Пул подключений - это своего рода политика кэширования, подумайте, как это настраивается.
Итак, подведем итог:
Компонент, который может определить, какое кэширование возможно и полезно.
Который чаще всего является клиентским кодом.Хотя здесь могут помочь сведения о вероятной задержке и устаревании, задокументированные авторами компонента.
Реже может быть клиентский код с помощью компонента, хотя для этого необходимо предоставить детали кэширования.
И иногда может быть компонентом с политикой кэширования, настраиваемой с помощью вызывающего кода.
Может быть компонентом только в редких случаях, потому что он реже для всех возможных вариантов использования, которые хорошо обслуживаются одним и тем жеполитика кеширования.Одним из важных исключений является случай, когда один и тот же экземпляр этого компонента будет обслуживать несколько клиентов, поскольку тогда факторы, влияющие на вышесказанное, распространяются на этих нескольких клиентов.