.Net——快取機制(一):利用Dictionary模擬快取
阿新 • • 發佈:2018-12-26
在計算機的硬體設計中,有一個被反覆使用的思想——快取。同樣,在軟體設計中,這個思想也可以用來解決資料讀取非常耗時帶來的效能問題(當然,在時間和空間上,我們要尋找一個平衡點)。
首先來看理想的快取應該是怎麼描述的:
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();
對字典的字典進行快取是不是有一點兒快取依賴的意思?