gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:25:58 25 4
gpt4 key购买 nike

基准: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com