引:每個接觸js的開發人員都不可避免的與for迴圈打交道,畢竟這是遍歷必不可少的工具之一。然而當迴圈次數比較大時,效率問題必須重視。在群眾,站長提出了這個話題,回去好好想了下,整理出來,大家一起討論討論。
1.倒序比正序效率高?
聽好多人說,倒序效率更高,好吧,做個實驗,讓事實說話
測試**:
複製**
測試結果如下圖test1:
第一列值為
執行正序時間,第二列為倒序執行時間。
可以看出在ie6和ie7中效率基本持平,而在ie8,谷歌瀏覽器中,倒序反而比正序還要慢,當然這是在js中做的測試
結論:js的for迴圈,在ie6,ie7中倒序的效率不比正序高,反而在ie8與谷歌瀏覽器中正序效率更高。其他瀏覽器為測試。
2.迴圈體中,區域性變數優化問題
在迴圈體內部,我們可能會宣告一些區域性變數(物件)來處理資料。如果變數宣告不當,也會影響效率。
看例子
複製**
在迴圈體中,宣告了乙個陣列作為區域性變數。
測試結果如下:
第一列值為在迴圈體內執行的時間,第二列在起始語句中執行的時間。
可以看出在ie6和ie7中優化的效率接近15倍,在ie8中10倍,谷歌瀏覽器執行速度快,但也優化了3倍以上,還是在js中做的測試
結論:js的for迴圈,在ie6、ie7、e8與谷歌瀏覽器中通過對區域性變數的優化可以成倍的提高執行效率。其他瀏覽器為測試。
補充:原來都是將區域性變數的宣告放到for迴圈外,但站長提醒,這樣的話,區域性變數的生存週期會變長,直到for的父級執行完後,所佔記憶體才會釋放。不過通過做了幾個小例子,沒有明顯的區別,主要是因為在測試中區域性變數占用的記憶體較少,而且這種區域性變數的量也較少,所以效果不明顯。
3.條件判斷語句中,盡量使用變數來判斷而不要去呼叫方法
在for的判斷語句中,經常遇到迴圈變數與某個值進行比較。而這個值經常是list的長度,或者某個資料的大小。雖然這些資料結構有已經定義好的求長求大小的方法。但是每次判斷時都會執行一次,也會影響效率。
看列子
複製**
執行結果比較
第一列值為在判斷語句中有方法呼叫執行的時間,第二列在判斷語句中使用變數執行的時間。
可以看出在ie6、ie7和ie8中接近4倍,谷歌瀏覽器執行速度快,但也優化了10倍以上
結論:js的for迴圈,在ie6、ie7、e8與谷歌瀏覽器中通過對判斷語句的優化可以成倍的提高執行效率。其他瀏覽器未測試。
4.巢狀迴圈問題
即乙個for迴圈中還巢狀這另一層for迴圈,可能這種巢狀是多層的。
這個留給大家自己測試,我的測試結果是裡外迴圈次數相差不大。但是有個原則,
盡量把迴圈次數少的寫到最外層
。總結:js的for迴圈中,
效能的優化主要通過減少迴圈體中變數的宣告和外部方法的呼叫來實現
。例子3中所講的判斷語句的優化其實也是對迴圈體中外部方法呼叫的優化。我在寫後台時,遇到過在for迴圈中寫sql的例子,每次迴圈都訪問一次資料庫,這個效率是極低的
當然,可能還有其他的需要優化的地方,我暫時先寫這些,不對的地方請大家指正。
JS效能優化 之 FOR迴圈
for 迴圈我們用的真的是太多了,但你是否關注過它的優化寫法呢?記錄下 for迴圈遍歷 for.of遍歷 foreach遍歷 for.in遍歷 map遍歷1.最最常規寫法,沒有任何不妥 for var i 0 i 10 i 2.迴圈的次數為變數的情況 for var i 0 i arr.length...
JS效能優化 之 FOR迴圈
for 迴圈我們用的真的是太多了,但你是否關注過它的優化寫法呢?記錄下 1.最最常規寫法,沒有任何不妥 for var i 0 i 10 i 2.迴圈的次數為變數的情況 for var i 0 i arr.length i 其實大多數人都是這種寫法,這種寫法的缺點在於,每次迴圈都要去讀取一次陣列的長...
js中關於setTimeOut()迴圈的問題
function stop function checktime i return i function fun2 week function starttime starttime 上面 執行起來是沒錯 若是這樣呢 while true 今天同學問到了這個為啥不能用迴圈呢,我給的解釋就是用迴圈沒有...