我正在阅读一本名为《Web开发专业JavaScript》的书,作者提到与使用数组存储字符串并使用join方法创建最终字符串相比,字符串连接是一种昂贵的操作。我很好奇,于是在这里进行了几次测试,看看它可以节省多少时间,以下是我的测试结果 -
不知何故,火狐浏览器通常会产生相似的时间,但在IE浏览器中,字符串连接要快得多。所以,这个想法现在是否已经过时了(浏览器可能已经改进了)?
我正在阅读一本名为《Web开发专业JavaScript》的书,作者提到与使用数组存储字符串并使用join方法创建最终字符串相比,字符串连接是一种昂贵的操作。我很好奇,于是在这里进行了几次测试,看看它可以节省多少时间,以下是我的测试结果 -
不知何故,火狐浏览器通常会产生相似的时间,但在IE浏览器中,字符串连接要快得多。所以,这个想法现在是否已经过时了(浏览器可能已经改进了)?
我在这个领域有一些经验,因为我的主要产品是一个大型的仅支持IE浏览器的Web应用程序,它需要进行大量的字符串拼接以构建XML文档并发送到服务器。例如,在最坏的情况下,一个页面可能会有5-10个iframe,每个iframe中都有几百个文本框,每个文本框都有5-10个扩展属性。
对于我们的保存功能,我们遍历每个选项卡(iframe)和该选项卡上的每个实体,提取每个实体上的所有扩展属性,并将它们全部放入一个巨大的XML文档中。
在分析和改进我们的保存方法时,我们发现在IE7中使用字符串连接比使用字符串数组方法慢得多。其他值得注意的地方是访问DOM对象的扩展属性非常慢,所以我们将它们全部放入JavaScript数组中。最后,生成JavaScript数组本身最好在服务器上完成,然后将它们作为文字控件写入页面,在页面加载时执行。
众所周知,不是所有的浏览器都是相同的。因此,不同领域的性能保证会因浏览器而异。
除此之外,我注意到和你一样的结果;然而,在删除不必要的缓冲类后,直接使用数组和一个10000个字符的字符串,结果更加紧密/一致(在FF 3.0.12中):http://jsbin.com/ehalu/
除非你正在进行大量的字符串连接,否则我认为这种类型的优化是微小的优化。你的时间可能更好地用于限制DOM 回流 和 查询(通常使用document.getElementbyById
/getElementByTagName
),实现AJAX结果的缓存(适用时),并利用事件冒泡(有一个链接,我现在找不到了)。
好的,关于这个问题,这里有一个相关的模块:
http://www.openjsan.org/doc/s/sh/shogo4405/String/Buffer/0.0.1/lib/String/Buffer.html
这是一种有效的创建字符串缓冲区的方法,通过使用
var buffer = new String.Buffer();
buffer.append("foo", "bar");
这是我所知道的最快的字符串缓冲实现方式。首先,如果您正在实现字符串缓冲,请不要使用 push 方法,因为它是一个内置方法,而且速度很慢,因为 push 方法会遍历整个参数数组,而不仅仅是添加一个元素。
这真的取决于 join 方法的实现方式,有些 join 方法的实现非常慢,而有些则相对较快。