效能優化之演算法和流程控制

2021-07-26 23:56:14 字數 2792 閱讀 8751

迴圈處理是最常見的程式設計模式之一,也是提公升效能必須關注的要點之一。

常見的優化方案有:

var props = ['prop1', 'prop2'],i = 0;

whlie(i < props.length)

該**只關注給定的屬性,減少了迴圈的開銷。

而對於,for、while、do-while。我在chrome下測試了一下,先建立乙個大小為1000000的陣列,每項乘100再疊加。

測試用例:

window.onload = function());

console.log(forcircle())

console.log(whilecircle())

console.log(docircle())

function forcircle()

console.profileend();

console.log('forcircle用時:' + (new date() - currtime) + 'ms');

return tal;

}function whilecircle()

console.profileend();

console.log('whilecircle用時:' + (new date() - currtime) + 'ms');

return tal;

}function docircle()while (k < items.length)

console.profileend();

console.log('docircle用時:' + (new date() - currtime) + 'ms');

return tal;

}function process(item)

}

取某次測試結果:

平均來說,for迴圈耗時8ms,while耗時4ms,dowhile耗時也是4ms。for是最慢的。

②減少迭代的工作量。把陣列長度儲存在區域性變數中再遍歷、顛倒陣列的遍歷順序。

最常見的乙個迴圈:

for(var i = 0;i < items.length; i++)

//var j = 0;

while (j < items.length)

//var k = 0;

dowhile (k < items.length)

在這個迴圈中,每次執行都會產生如下操作:

①查詢一次屬性(items.length)

②執行數值比較一次(i < items.length) 

③檢視控制條件是否為true(i < items.length ==true) 

④一次自增操作(i++)

⑤一次陣列查詢(items[i])

⑥一次函式呼叫(process(items[i]))

若把陣列長度存到乙個區域性變數,那麼就不需要每次都查詢一次items.length,也就提高了效能。

改為這樣:

for(var i = 0, len = items.length;i < len; i++)

//var j = 0,

count = items.length;

while (j < count)

//var k = 0,

num = items.length;

dowhile (k < num)

這樣在大多數瀏覽器中能節省大概25%的執行時間(ie中甚至可以節省50%)。總的來說,迴圈次數大的情況下,執行時間確實有提公升。取某次結果如下:

沒有區域性存量儲存陣列長度時:

有區域性變數儲存陣列長度時:

③減少迭代次數,「duffs device」即「達夫裝置「迴圈體展開技術。適合於迭代次數較大的情況下。

摘抄一下書中達夫裝置的基本理念:每次迴圈中最多可 8 次呼叫 process()函式。迴圈迭代次數為元素總數除以8。 因為總數不一定是 8的整數倍, 所以 startat 變數存放餘數, 指出第一次迴圈中應當執行多少次 process()。比方說現在有 12 個元素,那麼第一次迴圈將呼叫 process()4次,第二次迴圈呼叫 process()8 次,用 2 次迴圈代替了 12次迴圈。

基本模式:

var iterations = math.floor(items.length/8),  

startat = items.length%8,

i = 0;

do

startat = 0;

}while(--iterations);

⑤優化if-else,通常來說,switch比if-else快,但是在判斷條件較多時,使用查詢錶比if-else和switch都快。

流程控制之for

for 也是迴圈方法。但是用於取值的方法。for迴圈可以來取字串中字元,列表中的元素,字典中的關鍵字等 取字串中的字元 for i in hello print i,end h e l l o 取列表中元素 for i in a 11,33,w r print i,end a 11 33 w r 取...

流程控制之if判斷

一,如果 成績 90,那麼 優秀 如果成績 80且 90,那麼 良好 如果成績 70且 80,那麼 普通 其他情況 很差 score input please input your score score int score if score 90 print 優秀 elif score 80 pr...

流程控制之 if switch

int x 3 if x 1 system.out.println over if 條件表示式 else 否則 int b 1,c if b 1 else 和三元運算子很像。理解為三元運算子是if else 的簡寫格式。區別 不是所有的if else都能簡化的。為什麼呢?因為三元運算子運算完必須有結...