2013-06-17 4 views
0

Давайте иметь такой код:Кэширование функции результата на C#

Function<int,int> someFunc=(x)=>{ 
//SomeCalc 
return y; 
} 

, чем я хочу использовать функцию таким образом:

int result; 
if(someFunc(k)!=0) 
{ 
result=someFunc(k); 
} 

Вопрос заключается ли компилятор кэширует результат выполнения функции поэтому он будет рассчитан только один раз? Или он будет рассчитан два раза? Попробовал ответить Google, но не повезло.

А как насчет кеширования закрытий?

+0

У меня нет верного ответа, но откуда я его вижу, результат не должен кэшироваться, поскольку он может быть изменен между двумя вызовами. Кроме того, я не думаю, что компилятор имеет к этому какое-то отношение, так как я вижу, что выполнение функций выполняется во время выполнения, а не компиляция ... –

ответ

2

Функция будет выполнена дважды. Для компилятора/среды выполнения не существует способа узнать, будет ли результат функции второй и второй. Вам нужно будет кэшировать значение самостоятельно, если это была желаемая функциональность функции.

В этом случае, если вам лучше сохранить результат функции как переменной, чтобы вы могли ее проверить, а затем использовать, а не генерировать все результаты функции.

Использование лямбда, затворов и т. Д. Не меняет ни одно из вышеуказанных утверждений.

+0

> В этом случае, хотя вам лучше просто сохранить результат как переменная. Да, это очевидно, но я предпочитаю использовать больше кода стиля функции. Так грустно, что он не будет кэшировать себя :( –

+0

@ gleb.kudr Как язык/среда выполнения узнает, что результат будет таким же во второй раз? Это не так. Большой процент функции не будет одинаковым, если многократно повторяется. Кроме того, для кэширования всех результатов всех функций требуется много памяти. Возможно, программист не хочет потреблять всю эту память. Если они * делают *, тогда они могут явно использовать время для кэширования значений, которые достаточно дороги для генерации. (Не похоже, что это особенно сложно сделать, а занимает всего несколько строк кода). – Servy

0

Компилятор C# не выполняет кэширование результатов здесь. Я бы тоже не ожидал, что JIT тоже. Конечно, вы можете сделать это самостоятельно на локальной основе, просто используя локальную переменную. Вы также можете написать небольшой метод memoization для применения к самому закрытию, чтобы результаты были кэшированы более глобально - но вам нужно быть осторожным в том, как вы это использовали.

Компилятор C# может кэшировать сам лямбда-выражение при определенных обстоятельствах, но это деталь реализации. В частности, я считаю, что любые лямбда-выражения, которые не фиксируют какие-либо переменные (включая this), кэшируются реализацией Microsoft.

0

В результате не кэшируется. Расчет будет выполняться каждый раз, когда вы вызываете делегата.

Смежные вопросы