有這么一個(gè)題目:找出由數(shù)字組成的數(shù)組中最大值的索引。 (PS:不用考慮兼容性)
網(wǎng)站性能優(yōu)化 Javascript 代碼優(yōu)化 網(wǎng)站優(yōu)化
三個(gè)方案中,方案一最傳統(tǒng)最直接明了,相信也是大部分人腦海里最早浮現(xiàn)出來的方案;方案二比方案一更簡(jiǎn)潔,使用reduce方法替換了for循環(huán);方案三最簡(jiǎn)潔,沒有循環(huán),沒有條件判斷,一行代碼解決問題。大部分人都喜歡追求代碼簡(jiǎn)潔優(yōu)雅,要是可選的話,相信很多人都會(huì)選擇方案三。
但問題來了,這三個(gè)方案中哪一個(gè)性能最好呢?
方案一:性能最差,因?yàn)樗枰謩?dòng)去遍歷數(shù)組,并且每個(gè)遍歷都需要進(jìn)行條件判斷,所以這里的性能損耗最大;方案二:性能較好,因?yàn)樗褂昧薐avaScript內(nèi)置的reduce函數(shù)幫我們完成了方案一中手動(dòng)完成的數(shù)組遍歷工作;JavaScript內(nèi)置的方法肯定是比我們自己實(shí)現(xiàn)的要快,因此在同樣需要條件判斷的情況下,方案二肯定是由于方案一;方案三:性能最好,因?yàn)橄鄬?duì)方案二,它連條件判斷都省了,使用了Math.max替代。
但實(shí)際情況真的如上面所猜測(cè)的嗎?下面我們來做個(gè)測(cè)試:
測(cè)試地址:
indexOfMax-100,000 http://jsperf.com/indexofmax
indexOfMax-120,000 http://jsperf.com/indexofmax-120000
indexOfMax-130,000 http://jsperf.com/indexofmax-130000
測(cè)試結(jié)果如下:
網(wǎng)站性能優(yōu)化 Javascript 代碼優(yōu)化 網(wǎng)站優(yōu)化
從結(jié)果中可以看得出來,性能上:方案一最好,方案三次之,方案二最差;與上面猜測(cè)的結(jié)果完全相反。方案一最好猜測(cè)應(yīng)該是瀏覽器JavaScript解釋引擎對(duì)代碼進(jìn)行了優(yōu)化后執(zhí)行的結(jié)果,優(yōu)化后的代碼從底層實(shí)現(xiàn)上來看應(yīng)該是比reduce、indexOf、Math.max等底層接口的性能更好,因此效率更高。
同時(shí)注意到,在Chrome下,當(dāng)數(shù)組長(zhǎng)度達(dá)到130,000時(shí)瀏覽器拋出了最大調(diào)用堆棧的異常,我此前說過,瀏覽器對(duì)調(diào)用堆棧的大小是有限制的。不同瀏覽器對(duì)函數(shù)最大參數(shù)長(zhǎng)度的限制是不一樣的,所以這里需要注意下。
高級(jí)瀏覽器的表現(xiàn)似乎比較統(tǒng)一,那么IE的表現(xiàn)又怎么樣呢?



皖公網(wǎng)安備 34010202600669



