缓存机制(一):利用Dictionary模拟缓存

在计算机的硬件设计中,有一个被反复使用的思想——缓存。同样,在软件设计中,这个思想也可以用来解决数据读取非常耗时带来的性能问题(当然,在时间和空间上,我们要寻找一个平衡点)。

首先来看理想的缓存应该是怎么描述的:

static Func<T, R> Cache<T, R>(Func<T, R> func){var mem = new Dictionary<T, R>();return x =>{if (!mem.ContainsKey(x)){Console.WriteLine("未缓存,正在缓存!");mem[x] = func(x);}return mem[x];};}

大致就是给进去一个T,然后吐出来一个R。

run下看看:

#region 利用字典来实现对函数的缓存var cacheFunc = Cache<int, int>(DoSomeTing);Console.WriteLine(cacheFunc(10));Console.WriteLine(cacheFunc(5));Console.WriteLine(cacheFunc(10));Console.ReadKey(); #endregion

其中,DoSomeThing是可以是一个读取数据库的操作,复杂的计算操作等等,在这里,只写了个简单的意思下:

static int DoSomeTing(int a){return a * a;}

接下来的函数就比较有意思了,试想下,,如果dictionary的value值为一个字典类型数据呢?

static Func<int, int, int> DoSomeTing(){var dic=new Dictionary<int,Dictionary<int,int>>();return (a,b)=>{if (!dic.ContainsKey(a)){Console.WriteLine("a为{0}和b为{1}未进行缓存!",a,b);dic[a]=new Dictionary<int,int>();dic[a][b]=a+b;}else{if (!dic[a].ContainsKey(b)){Console.WriteLine("a为{0}已经缓存,b为{1}未进行缓存,正在缓存中",a,b);dic[a][b]=a+b;}}return dic[a][b];};}

run下看看:

//var sfunc = DoSomeTing();var sfunc=Cache<int,Func<int,int>>(x=>Cache<int,int>(y => x+y));Console.WriteLine(sfunc(10)(5));Console.WriteLine(sfunc(5)(10));Console.WriteLine(sfunc(10)(5));Console.ReadKey();

对字典的字典进行缓存是不是有一点儿缓存依赖的意思?

人生的失败往往是在关键时刻少了坚持。

缓存机制(一):利用Dictionary模拟缓存

相关文章:

你感兴趣的文章:

标签云: