2009年3月3日 星期二

[JS] 嚇一跳的效能差異: += VS array.join

這個大概很多人沒想到,這兩件風馬牛不相干的東西可以做相同的事,而且有效能上的差異
那麼...+=和array.join其實有什麼關係呢?
  1. +=可以用array.push + array.join代替
  2. array.join一般來說*會比+=快
*此"一般來說"是指在市場上流通的browser的主要版本
原因...正是因為javascript的string也是immutable**的
因為其immutable特性造就string concat時大量的object生產、reference切換,其影響可以比string的長度及concat次數對整個operation的效能影響更大(和早期Java類似)
**1. 如果你有學過Java,Javascript的string和Java的String/string一樣-一旦被賦值即不可更改,要改要生新object
2. 這immutable的特性加上js對primitive object的處理手法導致string method的寫法十分古怪

數據: [Further analysis of += vs array.join, broken down by browser]
這個branchmark的string size及loop次數很夠,加上一些library的bug report,IE那部分絕對可信
觀察:
  1. 在數據被足夠放大的情形下,舊版FF及Safari的array.join略快;opera及chrome v8除外,他們是+=比較快
    不過前兩者的新版也修正了
    (其實Chrome和Opera是正確的,operator應該是比較快而且+=是比較多人用的寫法..除perl派外很少人會用join吧?)
  2. IE的+=慢得嚇死人...似乎IE對於object lifecycle control及code優化做的很差
結論:如果你是支援IE 6和7為主又有一定數量的string concat,你最好用array.join...
另外,IE要自己做的優化比較多
(M$實在不擅長搞script engine和string,orz)

沒有留言:

張貼留言