我想使用记忆化来加速类似以下代码的执行(只有少量可能的参数值会被调用):
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;
}
一种可能性是将 args 封装到 Tuple 对象中,并使用 Dictionary(Dotnet 的新版本已为您完成元组的哈希)。
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
比较的实现应该已经自行处理了哈希冲突,所以这不应该是一个问题。 - janwValueTuple
,那么您就不会遭受内存分配的影响。 - Sean