函數緩存Memoization

純函數

函數式編程風格中有一個「純函數」的概念,純函數是一種無反作用的函數,除此以外純函數還有一個顯著的特色:對於一樣的輸入參數,老是返回一樣的結果。編程

性能提高

在平時的開發過程當中,咱們也應該儘可能把無反作用的「純計算」提取出來實現成「純函數」,尤爲是涉及到大量重複計算的過程,使用純函數+函數緩存的方式可以大幅提升程序的執行效率。緩存

Memoize

咱們能夠建立一個獨立的函數來記憶任何函數。咱們將此函數稱爲memoize。在傳入相同的參數時直接返回上次緩存的結果,這樣在計算大量有重複數據時,能夠提供性能,閉包

function memoize(func) {
          const cache = {};
          return function(...args) {
            const key = JSON.stringify(args)
            if(!cache.hasOwnProperty(key)) {
              cache[key] = func.apply(this, args)
            }
            return cache[key]
          }
        }
        
        function sum(n1, n2) {
          const sum = n1 + n2
          console.log(`${n1}+${n2}=${sum}`)
          return sum
        }
        const memoizedSum = memoize(sum)
        memoizedSum(1, 2) // 會打印出:1+2=3
        memoizedSum(1, 2) // 沒有輸出

memoizedSum在第一次執行時將執行結果緩存在了閉包中的緩存對象cache中,所以第二次執行時,因爲輸入參數相同,直接返回了緩存的結果。app

更好的選擇是使用ES6+支持的Map對象

const memoize2 = fn => {
          const cache = new Map();
          const cached = function(...val) {
            return cache.has(val) ? cache.get(val) : cache.set(val, fn.apply(this, val)) && cache.get(val);
          };
          cached.cache = cache;
          return cached;
        };
相關文章
相關標籤/搜索