1. 程式人生 > >.Net——快取機制(一):利用Dictionary模擬快取

.Net——快取機制(一):利用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();

          對字典的字典進行快取是不是有一點兒快取依賴的意思?