因爲上篇篇幅過長,致使編輯出了問題,另開一篇文章繼續:算法
(4)減小迭代次數,最廣爲人知的一種限制循環迭代次數的模式被稱爲「達夫設備(Duff`s Device)」數組
Duff`s Device的理念是:每次循環最多能夠調用8次process()。循環的迭代次數爲總數除以8,因爲不是全部數字都能被8整除,變量startAt用來存放餘數,表示第一次循環應該循環多少次。假設總次數爲12,則餘數爲4,表明第一次循環會調用4次process(),第二次循環startAt至爲0,循環8次,這樣就用兩次循環代替了12次循環。(感受這個方法仍是很好的,之後工做中必然用的到)緩存
第二個版本通過了優化,用while取代了switch,將餘數與主循環分開:函數
這種方式用兩次循環代替了以前的一次徐循環,可是它移除了循環主體中的switch語句,速度比原始循環還快。性能
不過使用這種方式目的是提升性能,要是循環次數自己就比較少,使用這種方式的效果並不明顯,以1000次循環爲一個分界點,若是超過1000次循環,那麼這樣的執行效率就會明顯提高。測試
(5)forEach():此方法便利一個數組的全部成員,並在每一個成員上執行一個函數。要運行的函數做爲參數傳給forEach(),並在調用時接收三個參數,分別是:當前的數組項的值、索引以及數組自己。優化
Items.forEach(function(value,index,arry){ process(value);})spa
總結:在全部狀況下,基於循環的迭代比基於函數的迭代法快8倍;對象
(二)條件blog
1、If-else對比switch
大多數狀況下switch比if-else運行要快;
2、if-else優化
(1)if-else中的條件語句應該老是按照從最大機率到最小几率的順序排列,以確保運行速度最快。
(2)若是一個條件語句須要判斷10次以上,爲了最小化條件判斷的次數,代碼能夠重寫爲一系列嵌套的if-else語句;這個適用於多個值域須要測試,單若是是離散值的話,用switch語句更合適;
(三)查找表
當使用查找表示,必須徹底拋棄條件判斷語句。這個過程變成數組項查詢或對象成員查詢。當單個鍵和單個值之間存在邏輯映射時,查找表的優點就能體現出來,switch語句更適合與每一個鍵都須要對應一個獨特的動做或一系動做的場合。
(四)遞歸
使用遞歸能夠把複雜的算法變得簡單。可是潛在問題是終止條件不明確或缺乏終止條件會致使函數長時間運行,並使得用戶界面處於假死狀態;
(五)、迭代算法
任何遞歸能實現的算法一樣能夠用迭代來實現。迭代算法一般包含幾個不一樣的循環,分別對應計算過程的不一樣方面,雖然這樣會引入他們自身的問題,可是運行一個循環比反覆調用一個函數的開銷要少不少
(六)、Memoization
Memoization他緩存前一個計算結果提供後續使用,避免重複工做。
重寫遞歸階乘函數,防止重複執行
今天就更新到這裏,後續還會繼續更新。。