javascript - Firefox 中的大子字符串比 Chrome 快约 9000 倍 : why?

标签 javascript performance google-chrome firefox jsperf

基准:http://jsperf.com/substringing

所以,我正在启动我的第一个基于 HTML5 浏览器的客户端项目。本质上,它必须将非常非常大的文本文件解析为一个或多个对象数组。我知道我将如何编码;我现在最关心的是尽快获得解析器代码,我的主要测试平台是 Chrome。然而,在查看子字符串方法之间的差异时(我已经很长一段时间没有接触过 JavaScript),我注意到与 FireFox 相比,Chrome 中的这个基准测试速度慢得令人难以置信。为什么?

我的第一个假设是,它与 FireFox 的 JS 引擎处理字符串对象的方式有关,对于 FireFox 来说,这个操作是简单的指针操作,而对于 Chrome 来说,它实际上是在进行硬拷贝。但是,我不确定为什么 Chrome 不会进行指针操作,或者为什么 FireFox 。有人有一些见解吗?

JSPerf 似乎丢弃了我的 FireFox 结果,而不是在 BrowserScope 上显示它们。对我来说,我在 FF4 中的 .substr() 上获得了 9,568,203 ±1.44% Ops/sec。

编辑:所以我看到 FF3.5 的性能结果实际上低于 Chrome。所以我决定检验我的指针假设。这让我想到了 2nd revision我的 Substrings 测试的结果是,FF4 中的 1,092,718±1.62% Ops/sec 与 Chrome 中的 1,195±3.81% Ops/sec 相比,仅快了 1000 倍,但仍然如此无法解释的性能差异。

后记:不,我对 Internet Explorer 一点也不关心。我关心的是如何提高自己的技能并更深入地了解这门语言。

最佳答案

对于 Spidermonkey(Firefox 中的 JS 引擎),substring() 调用只是创建一个新的“依赖字符串”:一个存储指向子字符串的指针的字符串对象关闭以及开始和结束偏移。这正是为了使 substring() 更快,并且对于不可变字符串来说这是一个明显的优化。

至于为什么V8不这样做...一种可能是V8试图节省空间:在依赖字符串设置中如果你保留子字符串但忘记了原始字符串,则原始字符串无法获取GCed,因为子字符串正在使用其字符串数据的一部分。

无论如何,我只是查看了 V8 源代码,看起来它们根本不执行任何类型的依赖字符串;不过,这些评论并没有解释为什么他们不这样做。

[更新,12/2013]:在我给出上述答案几个月后,V8 添加了对依赖字符串的支持,正如 Paul Draper 指出的那样。

关于javascript - Firefox 中的大子字符串比 Chrome 快约 9000 倍 : why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194466/

相关文章:

javascript - Intern 的 pollUntil 不适用于 Chrome

javascript - CSS 和 JavaScript 问题

javascript - 如何使用加号和减号更改 Accordion 标题?

javascript - 在 Google Chrome 中找到未捕获的语法错误

mysql - 将索引添加到 MySQL 中的 BIGINT 列会有所帮助吗?

performance - 在不同的线程(QT)上同时打开多个 SQLite 数据库实例

c# - 运行 selenium ui 测试时如何填充 siteminder "authentication required"chrome 弹出窗口

javascript - Protractor - 当网格的行列 ID 为 ="0-0"时,如何从一列中获取所有单元格并对它们求和

JavaScript 函数回调和事件

angular - 如何提高 Angular 6.0 应用程序的速度