Я хочу использовать мемоизацию для ускорения кода, похожего на (когда-либо вызывается только небольшое количество возможных значений аргументов):
double MyFun(double a,double b,int c,char d)
{
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
return a+b;
}
Одна из возможностей - это обернуть аргументы в объект Tuple и используйте словарь (в новых версиях Do tnet хэширование кортежей сделано за вас)
Dictionary<Tuple<double,double,int,char>,double> MyFunCache = new Dictionary<Tuple<double,double,int,char>,double> ();
double MyFun(double a,double b,int c,char d)
{
var tmp = Tuple<double,double,int,char>(a,b,c,d);
if(MyFunCache.ContainsKey(tmp))
{
return MyFunCache[tmp];
}
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
return a+b;
}
Но для этого требуется создавать объект Tuple каждый раз, когда вызывается функция, которая кажется расточительной, разве нет лучшего способа ? Что-то уже содержит аргументы?