LINUX.ORG.RU

Чем отличается человек от отца? Мемоизация это частный случай кэширования. Как она может от него отличаться?

Suntechnic ★★★★★
()
Последнее исправление: Suntechnic (всего исправлений: 1)
Ответ на: комментарий от Pavval

мемоизация является особым видом оптимизации, отличающимся от таких способов кеширования... bla-bla-bla

Очень информативно

anonimous
() автор топика
Ответ на: комментарий от anonimous

Видимо, так же как и человек от отца.

Ты сюда вообще отвечать пришел, или всё же дурные вопросы задавать? Ответил - пометь тему, как решенную.

Pavval ★★★★★
()
Ответ на: комментарий от Suntechnic

Спасибо огромное. Все просто и ясно. Это точно она? Я, значит уже использовал ее, не подозревая:)

anonimous
() автор топика
Ответ на: комментарий от anonimous

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

Suntechnic ★★★★★
()
Последнее исправление: Suntechnic (всего исправлений: 2)
Ответ на: комментарий от Suntechnic

Да, но я н совсем понял, в чем тут оптимизация? Поиск по словарю займет больше времени, чем просто присваивание. Получается, что она к оптимизаци никакого отношения не имеет?

anonimous
() автор топика
Ответ на: комментарий от anonimous

Почему ты так думаешь? Вот тебе реальный пример: У меня на одном из сайтов нужно для разных блоков на странице подставлять названия города к которому привязано событие/новость/коментарий и т.п. Городов ограниченное количество - что-то около десятка. Все элементы имеют привязку к городу по id. Теперь представь что каждый контроллер генерируя свой вывод будет дергать БД на предмет достать названия городов по их id. Вызовы эти идут через абстракцию типа PDO и в итоге после каждого запроса все равно придется вынимать название города из массива. Так что проще чиркануть функцию которая будет вынимать название городов по id 1 раз и держать их в памяти.

Т.е. такая оптимизация уместна когда:
1 Поле определения функции достаточно узкое, т.е. количество вариантов значения аргументов сильно ограничено.
2 Очень вероятно большое количество обращений за результатами от одних и тех же аргументов
3 Операция получение результатов достаточно медленная

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Возможно, имется в виду, если функция вызывается многократно, например, в цикле, компилятор вынесет эту хрень за пределы, т.е. будет подставлять сразу результат, и мы сэкономим на if (has_key($a&«_»&$b, Memento). Но, по идее, он и так должен это делать, я хз, все запутано.

anonimous
() автор топика
Ответ на: комментарий от Suntechnic

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

anonimous
() автор топика
Ответ на: комментарий от anonimous

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

Но тут важный момент есть - считывание данных из базы немного грязный пример, поскольку за время прошедшее с последнего вызова данные могли изменится. В вэбе это не имеет значения, поэтому допустимо. В каком-то приложении-демоне это может быть критической ошибкой. И мемоизация в чистом виде это когда данные возвращаемые функций всегда актуальны как в случае с Foo выше - в ряд ли за время прошедшее с последнего вызова может изменится операция умножения ;)

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Ну я так понял общий смысл, что мы делаем поверх основной структуры данных, где производится поиск, делаем некую структуру, содержащую наиболее вероятные (частоиспользуемые и т.д) варианты, и производим поиск сначала в ней, причем эта «надструктура» создается динамически, по каким-либо условиям, так?

anonimous
() автор топика
Ответ на: комментарий от anonimous

То есть, да, в твоем случае это умножние, дорогостоящая (условно) операция, которая не нужна, когда есть уже готовый результат в «памяти». В случае с базой этой дорогостоящей операцией будет поиск по базе. Все я понял, спасибо еще раз

anonimous
() автор топика
Ответ на: комментарий от Suntechnic

Мемоизация не является частным случаем кеширования. Кеш имеет право и забыть что-то, а мемоизация гарантированно один раз.

anonymous
()
Ответ на: комментарий от Suntechnic

Вычисляет результат на конкретных входных данных. Один единственный раз, больше вычислять не будет. Из кеша же данные могут выталкиваться (т.к. размер кеша ограничен).

То есть, условно, кеширование - ограниченная мемоизация.

anonymous
()
Ответ на: комментарий от anonymous

Вычисляет результат на конкретных входных данных. Один единственный раз, больше вычислять не будет

Неверно. Например для мемоизации через memcached всегда явно указывается время жизни вычисленного значения.

monk ★★★★★
()
Ответ на: комментарий от Suntechnic

Кстати, тогда вопрос: является ли мемоизацией такой код:

double sin1(int x)
{
    switch(x)
    {
        case 0: return 0; break;
        case 30: return 0.5; break;
        case 45: return 1; break;
        default: return sin(x);
    }
}
?

monk ★★★★★
()

Чем отличается маршалинг от сериализации? Рефлексия от интроспекции? Реентерабельность от потокобезопасности?

crowbar
()
Ответ на: комментарий от crowbar

Это к чему? Ты много разных словечек знаешь, да?

anonymous
()
Ответ на: комментарий от monk

А почему нет (по сути)? Разница в том, что тут мы «запоминаем» единожды — определяем, а там динамически добавляем. Те же яйца, только сбоку. Разница в реализации. Я, правда, не знаю, «официальную» трактовку, но, в принципе, анологично.

anonimous
() автор топика
Ответ на: комментарий от monk

Неверно. Например для мемоизации через memcached всегда явно указывается время жизни вычисленного значения.

Верно. memcached не выполняет мемоизацию, он выполняет кеширование.

anonymous
()
Ответ на: комментарий от anonimous

А почему нет (по сути)?

Есть мемоизация, нет кэширования. Если это мемоизация, то мемоизация не является подвидом кэширования, а «как правило реализуется кэшированием».

monk ★★★★★
()
Ответ на: комментарий от anonymous

То есть, условно, кеширование - ограниченная мемоизация.

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

anonimous
() автор топика
Ответ на: комментарий от crowbar

[offtopic]

Чем отличается маршалинг от сериализации?

Кстати, чем? А то я опять забыл. [/offtopic]

ilammy ★★★
()
Ответ на: комментарий от monk

Хм... Я думаю в некотором смысле - да. Но это очевидно не кэширование. Вообще, если подумать, то по видимому термины такого плана весьма размыты. Ну вот допустим мы начнем спорить сейчас, является ли это мемоизацией или нет. Что будет истиной в последней инстанции? Чьё мнение? Понятно что терминология не достаточно точно определена. Даже о том что вообще такое кэшировани можно поспорить весьма. Вот к примеру кэш который в hdd, процессорный кэш и кэш запросов базы данных - ясно же что это вещи несколько разные, но все это кэш...

Suntechnic ★★★★★
()
Ответ на: комментарий от monk

А, ну вот, или так. Наверное это несколько более точная формулировка.

Suntechnic ★★★★★
()
Ответ на: комментарий от anonymous

Ну какой-то балбес немного попутал термины. Бывает.

...но ты абсолютно точно уверен, что этот балбес не ты :-)

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.