Многие функции (и методы) в проекте очень часто возвращают одни и те же значения при тех же аргументах, например:
- математические функции:
- function SomeMaths($x)
- {
- return $x + pow($x, 3.2) - cos($x);
- }
- функции, возвращающие содержимое файла:
- function GetConfiguration()
- {
- return parse_ini_file('configuration.ini');
- }
- функции, возвращающие данные из базы данных:
- function GetArticleById($id)
- {
- $sqlId = mysql_real_escape_string($id);
- $result = mysql_query("SELECT `id`, `title` FROM
- `article` WHERE `id` = '$sqlId' LIMIT 1");
- if (FALSE === $result)
- {
- throw new Exception('Ошибка в запросе.');
- }
- return mysql_fetch_assoc($result);
- }
- вы заметил, что эта функция долго выполняется
- возвращаемые значения всегда одни и те же при тех же передаваемых аргументах
- функция вызывается более чем один раз
- Если в вашем проекте используются подобные функции, а так же:
Задумайтесь о кэширование возвращаемых ею значений.
Вот как это можно сделать (да, есть и более продвинутые техники, но это не тема этой статьи): добавим статическую переменную в функцию, которая будет хранить ассоциативный массив, связывающий комбинацию аргументов с возвращаемым значением:
function GetArticleById($id) { static $cache = array(); // Возвращаемое значение еще не кэшировалось? if (!isset($cache[$id])) { $sqlId = mysql_real_escape_string($id); $result = mysql_query("SELECT `id`, `title` FROM `article` WHERE `id` = '$sqlId' LIMIT 1"); if (FALSE === $result) { throw new Exception('Ошибка в запросе.'); } // Добавляем возвращаемое значение в кэш $cache[$id] = mysql_fetch_assoc($result); } // Возвращаем содержимое кэша return $cache[$id]; }
Теперь каждый запрос к базе данных, возможно, трудоемкий, будет выполняться только один раз при первом вызове функции. Каждый следующий вызов функции с тем же аргументом будет использовать кэшированное значение.
Имейте в виду, что количество кэшируемых значений должно быть в разумных пределах (определяемых размером свободной памяти). Если есть миллионы возможных комбинаций аргументов для функции запускаемой один раз, то стоит подумать о других способах оптимизации (и возможно я расскажу о них в следующих публикациях).
И всегда профилируйте ваш код до того, как использовать такую оптимизацию.
![]()


В Вашей RSS нельзя получать полные тексты записей, что ли?
нет, нельзя. возможно позже сделаю