JavaScript字符串拼接的性能问题

来源:互联网 发布:网络同传系统 编辑:程序博客网 时间:2024/05/22 04:27

这个问题不知从何而生,以前我很少关注细节,今天突然想到,字符串拼接如何高效,或者有高效一说吗?因为我们知道,不同的浏览器引擎不同,如Chrome/Mozilla FF/MSIE,他们都是使用的自己的内核,因此优化程度都不相同。

字符串拼接,我想大部分人都会直接使用 + 操作符,尤其是前端操作DOM的时候,的确很方便。那么很多人是不是会想,最简单的代码肯定是性能最差的,最没有技术含量的?不见得,代码的高效固然重要,但并非是业务的全部。除非你是在搞学术,你用一堆括号的函数式语言别人不会抱怨难读,反而以此为荣。

代码的性能不是全部,将多条代码优化成一条也并不一定就高效。大家都知道Python好用,List Comprehension什么的似乎是Python的标志。用它和lambda配合map, reduce, filter甚至可以将5+行的函数计算写成一行,就如同三元操作符一样。但这并不好,造成可读性降低也是性能差的一种表现,只不过作用于程序员而不是解释器。

用+直接拼接字符串自然会对性能产生一些影响,因为字符串是不可变的,在操作的时候会产生临时字符串副本,+操作符需要消耗时间,重新赋值分配内存需要消耗时间。

低版本的IE6/7因为垃圾回收机制的问题, 用+操作符性能会有下降,应该使用Array.join方法。另外使用数组,也相当于空间换时间的方法来提高性能。

现代浏览器的引擎对+操作符进行了优化,因此使用字符串拼接的性能未必比join差。不过在循环数组的时候,把Array.length属性缓存起来会提高性能,因为每一次循环会计算length属性值。

do while也可以提高性能,因为先进行循环再进行判断嘛!不过似乎没有太大必要。

后端Node获取data事件的数据的时候,是无法chunk += chunk的,因为引擎会自动进行toString(),那么对于中文字3个字节,每次获取8字节,第三个字的最后一字节就被丢到下一次chunk,造成有的字正常,有的字乱码,所以必须push到数组然后再拼接。
这个在Cnode社区有文章,《Nodejs深入浅出》也讲得很详细。

0 0