亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#函數式編程中的緩存技術詳解

2020-01-24 02:09:46
字體:
來源:轉載
供稿:網友

緩存技術

      該節我們將分成兩部分來講解,第一部分為預計算,第二部分則為緩存。緩存這個技術對應從事開發的人員來說是非常熟悉的,從頁面緩存到數據庫緩存無處不在,而其最重要的特點就是在第一次查詢后將數據緩存,在以后的查詢過程中就無需重新計算而直接從內存中將結果返回,大大提高了性能,而我們這里的緩存則集中運用在函數上。

 預計算

      可能一些人并不能立馬理解這個詞的含義,所以我們就簡單的從生活例子出發介紹一下。很多人在工作中一定會這樣做事,比如上級吩咐了你一件事,但是這件事的后半部分要等另一個同事做好之后把對應的材料給你你才能完成。但是我們不可能一直等到那個同事完成了把材料交給我們,我們才去做這件事。而是會將這件事的前半部分做好,那么剩下的只要那個同事完成并交給我們,我們就直接完成下半部分就可以了。同理這樣的思維也可以用在軟件開發中,比如下面這個函數:

      函數內部是利用a的值計算出c,最后再將c和b相加得出最后的結果。當然這個例子并不能完整的體現預計算的特點,但能夠讓我們理解預計算是如何實現的。假設這里的

是一個耗時操作,并且實際使用中會出現a的值不變動,但是b的值會經常變動的情況,但是每次調用這個函數都會重新根據a計算出c,那么我們就需要一定的方式改變這個格局,這里我們可以先嘗試采用部分應用(這里介紹一個函數式開發的庫->PortableFCSLib,可以在NuGet中安裝或者到他的github網站上下載:https://github.com/rmoritz/PortableFCSLib):

這里我們的意圖是只會計算一次C的值,而不是兩次,然后我們看看最終的輸出結果:

      還是計算了兩次的C,理由很簡單,因為部分應用僅僅只是利用閉包將參數保存了起來,只有所有參數傳遞完成后才會調用這個函數,并達不到預計算的效果,所以我們就需要新的方式來完成,下面我們修改DoSomeThing函數:

      這里我們可以看到參數只剩下了a,而返回值則變成了函數,這樣才執行第一次這個方法之后將會計算出c值,由于閉包的緣故c的值就會被保存。下面我們來看一看如何調用:

最后看看是不是只計算了一次C的值:

      這樣我們就大功告成了,當然筆者在這里還要再提一下,這些例子僅僅只是為了讀者能夠快速的理解,在實際的運用中還要讀者能夠根據情況靈活多變,比如這個函數接收三個參數,但是前兩個不經常變動,但是第三個卻經常變動,并且函數的內部是根據前兩個參數計算得出一個結果,而返回值需要根據第三個參數和這個計算后的值得出,那么我們就可以返回但一個參數的函數,而函數本身需要接收兩個。

 緩存

      利用該技術之前我們需要理解幾個名詞,就是引用透明函數純度。這兩者都是指在我們調用一個函數時,無論任何時候,只要傳遞的參數一致,返回的結果都應該是一致的。這樣的函數我們才能夠利用緩存。首先我們先定義一個函數,而這個函數將會是我們后面需要緩存的函數:

然后我們修改函數使之能夠進行緩存:

      這里我們可以看到我們利用了字典來對這個函數進行了緩存。函數首先從字典中判斷是否存在參數a的key,如果存在直接返回計算后的結果,如果不存在則計算該結果,并保存到字段中,這樣我們就實現了一個簡單的緩存。下面我們來看看最終的結果,是不是確實使用了緩存:

      當傳遞參數10的時候,因為緩存中沒有所以進行了緩存,參數5也是一樣,而下一行再次計算10的時候就沒有進行計算而是直接從字典中返回了對應的結果。但是上面這種方式還存在一個問題,如果存在多個函數都需要緩存,則這個類會存在多個字段類型的字段(一些人可能會問為什么不能共享一個字典,這樣你就要在key的命名上花費一定的功夫,而且很容易造成重復),那么我們就需要一種能夠不污染類的方式來進行緩存,這里我們先介紹如何使用FCSLib中的Memoizer實現內部緩存:

      這里我們可以看到Memoizer公開了一個GetMemory的靜態方式用來獲取對應的緩存對象,然后利用這個返回的對象我們就可以進行緩存,最終的效果跟之前的是一樣的,我們可以看看最后控制臺輸出的結果:

 如果你不知道該為這個函數起什么名字,我們可以利用反射來獲取這個函數的全稱,比如下面這個修改之后的DoSomeThing函數就是利用了這個方式:

當然除了手動修改函數的方式,我們也可以采用自動化來使沒有利用緩存的函數使用緩存技術,下面我們來寫一個函數來實現這個功能:

      我們可以看到紅色框住的部分,其實就是利用了閉包,在這個函數之上又嵌套了一層函數,這樣我們就能夠進行緩存了,只有在緩存中不存在時才調用函數求值,但是面對多個參數的情況,上面這些無法正常緩存了。那么我們就需要使用深度緩存,而所謂的深度緩存就是利用字典套字典來進行保存的,比如下面這個函數,需要傳遞兩個參數,那么對應的緩存就是:

然后就是Main中進行調用:

      最后我們可以看到下面的這個結果,第一次調用sfunc(10,5)時建立了緩存,再第二次傳遞同樣的參數調用后可以看到控制臺并沒有輸出對應的字符串:

      當然這樣字典的嵌套在參數很多的情況下,會顯得很復雜,并且也會消耗很多內存。但是當前也沒有非常好的解決方案,下面我們還可以利用之前寫的Cache函數來實現上面這種多個參數的緩存:

      重點是我們紅色框住的那部分,具體的嵌套就是第一個字典的key是第一個參數,value就是下個函數的引用,當然這個函數是經過Cache包裝之后的,那么自然在調用value的函數之后自然也起到了緩存作用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
影音先锋日韩有码| 国产盗摄xxxx视频xxx69| 国产免费一区二区三区在线能观看| 日韩欧美在线国产| 欧美情侣性视频| 日韩av一区在线观看| 国产成人精品国内自产拍免费看| 国产精品视频精品视频| 亚洲最大的免费| 国产一区二区三区视频| 日韩视频免费大全中文字幕| 欧美极品欧美精品欧美视频| 国产精品视频一区二区三区四| 久久影视电视剧免费网站清宫辞电视| 亚洲精品自在久久| 91高清视频免费| 55夜色66夜色国产精品视频| 欧美日韩中文在线| 成人高清视频观看www| 亚洲国产精品久久久久秋霞不卡| 另类色图亚洲色图| 亚洲久久久久久久久久| 久久久久中文字幕2018| 亚洲直播在线一区| 97香蕉超级碰碰久久免费软件| 日韩精品免费在线视频观看| 欧美日韩久久久久| 亚洲自拍小视频免费观看| 欧美激情aaaa| 久久久欧美精品| 欧美大片在线看| 亚洲剧情一区二区| 国产精品海角社区在线观看| 亚洲一区精品电影| 国产精品成人国产乱一区| 亚洲欧美日韩精品久久| 国产成人精品久久久| 久久精品一区中文字幕| 日韩av电影手机在线| 精品少妇一区二区30p| 日韩电影视频免费| 欧美激情中文字幕乱码免费| 中文字幕精品在线视频| 欧美精品一区三区| 久久久精品免费视频| 日韩美女在线播放| 国产精品18久久久久久麻辣| 国产视频自拍一区| 国产在线精品自拍| 国产在线日韩在线| 国产精品日韩在线一区| 国产精品亚洲激情| 亚洲精品日韩激情在线电影| 日产精品99久久久久久| 国产v综合v亚洲欧美久久| 4p变态网欧美系列| 黄网动漫久久久| 精品久久香蕉国产线看观看gif| 精品毛片网大全| 日韩精品视频三区| 国产剧情日韩欧美| 精品毛片网大全| 欧美日本精品在线| 亚洲美女在线观看| 91理论片午午论夜理片久久| 日本久久久久久久久久久| 日韩精品亚洲元码| 亚洲美女在线观看| 国产亚洲精品日韩| 国产一区二区三区欧美| xvideos亚洲人网站| 日韩国产精品亚洲а∨天堂免| 日韩视频免费观看| 久久久国产视频91| 色阁综合伊人av| 亚洲日韩第一页| 亚洲日本aⅴ片在线观看香蕉| 国产免费久久av| 日韩免费电影在线观看| 欧美国产日韩一区二区在线观看| 岛国视频午夜一区免费在线观看| 九九热在线精品视频| 亚洲第一视频网| 欧美综合一区第一页| 在线观看视频亚洲| 亚洲自拍欧美另类| 欧美精品情趣视频| 国产美女精彩久久| 成人a在线观看| 亚洲成人av片| 热久久美女精品天天吊色| 精品国产一区av| 欧美性生交大片免费| 亚洲国产精品99| 国产精品成人一区二区三区吃奶| 国产精品高潮在线| 成人免费视频网址| 538国产精品一区二区免费视频| 中文字幕亚洲第一| 555www成人网| 九九热99久久久国产盗摄| 精品久久久久久久中文字幕| 久久精品99久久久香蕉| 国产日韩在线免费| 精品国产乱码久久久久久虫虫漫画| 久久99精品久久久久久青青91| 日韩精品在线影院| 国产亚洲欧美视频| 亚洲wwwav| 国产精品中文字幕在线| 一本色道久久88综合日韩精品| 最近2019中文免费高清视频观看www99| 26uuu亚洲国产精品| 欧美日韩在线观看视频| 中文一区二区视频| 精品欧美激情精品一区| 欧美制服第一页| 成人xvideos免费视频| 国产丝袜高跟一区| 国产成人亚洲综合91精品| 韩国精品美女www爽爽爽视频| 欧美性开放视频| 亚洲人精品午夜在线观看| 国产精品91久久久久久| 亚洲精品98久久久久久中文字幕| 日韩免费精品视频| 欧美与欧洲交xxxx免费观看| 国产91色在线| 国产高清视频一区三区| 搡老女人一区二区三区视频tv| 在线观看国产成人av片| 亚洲成人性视频| 日韩av男人的天堂| 久久久免费精品| 久久91亚洲人成电影网站| www日韩中文字幕在线看| 亚洲国产中文字幕在线观看| 久久成人精品视频| 亚洲国产精品999| 在线视频欧美性高潮| 久久精品在线播放| 亚洲成人激情在线观看| 日韩欧美在线观看视频| 欧美黄色片视频| 精品成人69xx.xyz| 国内外成人免费激情在线视频| 欧美日韩国产专区| 久久中文字幕在线视频| 国产91网红主播在线观看| 亚洲性猛交xxxxwww| 韩国欧美亚洲国产| 日本午夜在线亚洲.国产| 亚洲欧美国产一区二区三区| 2018中文字幕一区二区三区| 国产精品吹潮在线观看| 亚洲美女性视频| 亚洲国产又黄又爽女人高潮的| 国产亚洲精品美女久久久久| 日韩视频免费大全中文字幕| 国产高清视频一区三区| 日韩欧美国产黄色| 精品女厕一区二区三区| 91精品国产高清自在线| 久久精品国产91精品亚洲|