JavaScript的記憶函式真的可以提升效能嗎?

彈指壹揮間發表於2017-09-16
1 記憶函式是什麼呢?
讓函式記住曾經計算過的引數對應的結果
2 那我們為什麼使用記憶函式呢?
答案是 避免重複計算
3 在工作中如何使用和實現函式記憶 ?
形成閉包,在閉包中維護一個雜湊陣列(其實就是物件),讓雜湊陣列幫你記住曾經你做過的計算

請看下面的例子:(計算質數)
先寫兩個函式

第一個數帶記憶功能的:

let isPrime = (function () {
     let hash = {//雜湊中儲存類似這樣的結構
        //8: false,
        //7: true
      }
      let isPrime = (n)=> { // 返回內層函式
         if (n <3) {
             return true
          } else if (hash[n] !==undefined) {
              return hash[n]
          } else {
             for (leti = 2; i < Math.sqrt(n);i++) {
                 if (n%i ==0) {
                    return hash[n] =false;
                 }
             }
            return hash[n] =true
         }
     }
    return isPrime
})() //這個函式使用閉包 和 一個物件(實現記憶)


第二個是個普通函式

let isPrime1 = (n)=> {
    if (n <3) {
       return true
     } else {
        for (leti = 2; i < Math.sqrt(n);i++) {
           if (n%i ==0) {
               return false;
           }
       }
      return true
    }
}

然後我們來見證一下他們的區別吧~~~~

// 先宣告一個空陣列 我往裡push 1000000 個 1100 以內的 隨機數

let array = []
for (leti = 0; i < 1000000; i++) {
    array.push(parseInt(Math.random() *1100 ))
}

進入測試階段 ~~~ (利用console.time 和 console.Endtime)看看執行時間.....

// 這個是沒有帶函式記憶的~~

console.time('isPrime1')
for (leti = 0; i < array.length;i++) {
   isPrime1(array[i])
}
console.timeEnd('isPrime1')


// 這個是帶函式記憶的

console.time('isPrime')

for (leti = 0; i < array.length;i++) {
    isPrime(array[i])
}
console.timeEnd('isPrime')

下面就是結果了~~

日常專案中能用到的話,也可以提升些效能吧~~~^_^


相關文章