JavaScript
Event Loop
讀書會
記憶函式 ( Memoization ) 是一種優化程式技巧,把需要大量計算 ( 長遞歸、長迭代操作 ) 的函式將其參數與結果緩存 ( Cache ),若調用記憶函式且給予相同參數時,不須經過計算程序,直接回傳相同結果。
假設有一個工人,這位工人需要去倉庫拿工具 ( getTool ) 來完成他的工作 ( task ) :
但我們會發現,如果工人做同樣的工作 ( task ),他仍然會不斷跑去倉庫拿取工具 :
Day 1:工人 ( 小明 ) 第一天修理大水管,跑到倉庫拿工具。
Day 2:工人 ( 小明 ) 第二天繼續修理大水管,還是跑到倉庫拿工具。
Day 3:工人 ( 小明 ) 第三天繼續修理大水管,還是跑到倉庫拿工具
( 小明 OS : e04,給我工具箱 ! )。
讓我們把拿取工具 ( getTool ) 過程優化 :
然後訂定小明一個工作流程 :
如此一來,當小明做同樣的工作,他就知道已經有拿過工具,直接執行工作內容就可以了 !
但是當小明每天做不同的工作,他還是得回去倉庫拿給西 ( 工具 ) :
每個功能函式都要寫成 Memoized Function 太麻煩,不妨設計一個 Memoize 工具函式吧 !
Cache 雖然可以優化執行效能,但 Cache 也會因處理大量資料 ( 有很多不同的資料 ) 時,占用大量記憶體且不會釋放,因此 Memoization 也是一把雙面刃,需要注意使用時機。
Vue 也有提供給我們選擇使用 Memoization 或者不使用,也就是 Computed 及 Methods 方法。computed
帶有 Cache 機制,也就是在 Computed 它是屬於 Memoization,這也是為什麼 computed
都要求一定要 return 結果,否則會報錯,而 methods
就沒有 Cache 了,每次呼叫 Methods 的方法時都會重新執行。
此外,主流框架對於 Virtual DOM 渲染基本上都有 Cache 的機制,因此可以時常看見對於效能好的裝置來說,瀏覽有使用 Framework 的網頁時,整體網頁瀏覽較為順暢,但若是效能或記憶體容量較差的裝置來說,瀏覽使用 Framework 的網頁時常會有跑不動 ( Lag ) 的感覺。
費波納契數列 ( Fibonacci Sequence ) 指的是 :
建立一個 Fibonacci 查詢函式
除了 n = 1
、n = 2
的情況外,可以觀察每個 fibonacci 計算出來的值都是前兩個 fibonacci 相加的結果,也就是
然而,利用這種初步的遞迴函式演算法是屬於 O(n^2),也就是當 n 的值愈大,運算所花費的時間會呈指數 ( 爆炸性 ) 成長 :
圖片來源:Learning Algorithms in JavaScript from Scratch by Eric Traub @ Udemy
我們可以用上面設計的 Momoized Function 來封裝 fibonacci
: