Для чего нужны воспоминания и действительно ли они так полезны? - PullRequest
28 голосов
/ 14 июля 2010

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

Ответы [ 12 ]

1 голос
/ 14 июля 2010

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

0 голосов
/ 14 июля 2010

Memoization - это просто модное слово для кеширования. Если ваши расчеты обходятся дороже, чем извлечение информации из кеша, то это хорошо. Проблема в том, что процессоры работают быстро, а память работает медленно. Поэтому я обнаружил, что использование заметок обычно намного медленнее, чем просто повторение расчетов.

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

РЕДАКТИРОВАТЬ

Давай, опускай меня, сколько хочешь. Это не изменит того факта, что вам нужно делать реальный бенчмаркинг, а не просто слепо начинать бросать все в хеш-таблицы.

Если вы знаете свой диапазон значений во время компиляции, скажем, потому что вы используете n! а n - это 32-битное целое число, тогда вам лучше использовать статический массив.

Если ваш диапазон значений большой, скажем, любое двойное, то ваша хеш-таблица может стать настолько большой, что станет серьезной проблемой.

Если один и тот же результат используется снова и снова в сочетании с данным объектом, то может иметь смысл сохранить это значение вместе с объектом.

В моем случае я обнаружил, что более 90% времени входные данные для любой данной итерации совпадают с последней итерацией. Это означает, что мне просто нужно сохранить последний ввод и последний результат, и только пересчитать, если ввод изменился. Это было на порядок быстрее, чем использование памятки для этого алгоритма.

...