那麼...+=和array.join其實有什麼關係呢?
- +=可以用array.push + array.join代替
- array.join一般來說*會比+=快
原因...正是因為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那部分絕對可信
觀察:
- 在數據被足夠放大的情形下,舊版FF及Safari的array.join略快;opera及chrome v8除外,他們是+=比較快
不過前兩者的新版也修正了
(其實Chrome和Opera是正確的,operator應該是比較快而且+=是比較多人用的寫法..除perl派外很少人會用join吧?) - IE的+=慢得嚇死人...似乎IE對於object lifecycle control及code優化做的很差
另外,IE要自己做的優化比較多
(M$實在不擅長搞script engine和string,orz)
沒有留言:
張貼留言