Firefox 中的大子字符串比 Chrome 快约 9000 倍:为什么?

2024-01-25

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

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

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

JSPerf 似乎丢弃了我的 FireFox 结果,而不是在 BrowserScope 上显示它们。对我来说,每秒执行次数为 9,568,203 ±1.44%.substr() in FF4.

编辑:所以我看到 FF3.5 的性能结果实际上低于 Chrome。所以我决定检验我的指针假设。这让我想到了一个第二次修订 http://jsperf.com/substringing/2我的子字符串测试,正在做1,092,718±1.62%FF4 中的每秒操作数与1,195±3.81%Chrome 中的 Ops/sec,仅快了 1000 倍,但性能仍然存在难以解释的差异。

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


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firefox 中的大子字符串比 Chrome 快约 9000 倍:为什么? 的相关文章

随机推荐

  • 需要一些帮助在 Amazon EC2 和 VPS 之间进行选择 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在我的公司 我们正在考虑托管一个博客和一个 CMS 我们仍在构建该产品 尚未投入使用 我们正在考虑一些托管选项 我们需要对系统有完整的 root sh
  • VB.Net 中的只读局部变量

    这是一个非常简单的问题 我很惊讶我必须问它 但是 如何在 VB Net 中声明只读局部变量 Java 和 C 有 Final const 局部变量 所以我确信 VB Net 一定有它们 但我就是找不到它的语法 不幸的是 VB NET仅支持只
  • Android 保存游戏状态

    我不确定应该如何保存我正在开发的游戏的游戏状态 我应该保存包含所有游戏信息的实例 对象吗 如果是 怎么办 或者我应该将所有相关信息保存在 txt 文件中并在需要时保存 加载信息 您是如何做到这一点的 您对我的建议有何看法 除非将实例 对象序
  • 如何在postgres中将整数分钟转换为间隔

    我正在尝试将整数分钟转换为 postgres 中的间隔 是否有任何函数可以帮助我将其转换为间隔 或者我应该将其除以 60 并得到最终结果 20 minutes will be like 00 20 00 as result 最快的方法是与m
  • Firefox 和 Chrome 中的文本区域填充不一致

    我的文本区域元素上有填充 我希望当您在文本区域内滚动时内容保持填充状态 它在 Firefox 中按预期工作 但在 Chrome 中却不然 下图显示了输出的差异 CSS textarea width 250px height 160px pa
  • 在 C++ 中计算字符串的算术表达式[重复]

    这个问题在这里已经有答案了 我正在寻找一种简单的方法来计算字符串中的简单数学表达式 如下所示 3 2 4 1 4 9 6 我只是想 and 运营加 and 迹象 和 优先级高于 可以尝试一下 http partow net programm
  • 为什么 CV::Mat 图像的颜色空间错误(GBR 而不是 RGB 或 BGR)?

    我有一个 Python 模块 它将 RGB 发送到 C 并在那里被消耗 然而 无论我做什么 图像都有错误的色彩空间 那是我试图将其转换为RGB 假设它仍然在 BGR 中 尽管在 python 中它故意通过执行以下操作转换为 RGB retu
  • 在 C# 中使用反应式扩展时如何显示进度

    我在 C 中使用反应式扩展来执行一些计算 这是我的代码到目前为止的样子 我尝试将代码包装起来 以便在计算方法中执行一系列任务时可以显示进度 这是可观察到的 IObservable
  • LINQ 表达式语法如何与 Include() 一起使用以进行预加载

    我在下面有一个查询 但我想执行 Include 来急切加载属性 Actions 有一个导航属性 User Action User 1 我的基本查询 from a in Actions join u in Users on a UserId
  • 在使用 SQL Server 数据库邮件创建的电子邮件中嵌入图像

    我正在仅在 SQL Server 中开发电子邮件解决方案 该解决方案将使用数据库邮件发送 HTML 格式的电子邮件 问题是 HTML 中的图像需要嵌入到外发电子邮件中 如果我使用 net 应用程序来生成和发送电子邮件 这不会成为问题 但不幸
  • 用于验证带扩展名的 Windows 和 Linux 路径的正则表达式

    我正在尝试编写一个函数 该函数将验证给定路径在带有文件扩展名的 Linux Windows 中是否有效 ex Windows路径 D DATA My Project 01 07 03 061418738709443 docLinux路径 s
  • PHP 中的文件夹作为参数

    我想创建一个脚本 将网站中请求的每个文件夹作为参数传递 例如 如果有人请求 www example com foo 这将被重定向到主index php并作为参数传递 在请求时得到相同的结果www example com index php
  • Java中如何实现并发读取映射到内存的文件?

    我有很多线程同时读取同一个文件 总共大约100M 并且只有一个线程更新文件 我想将文件映射到内存中以减少FILE I O 在 Java 中如何做到这一点 我基本上考虑了以下2种方法 用字节数组存储文件 多线程读取时每次创建ByteArray
  • 为什么 CarPlay 在真车上会崩溃?

    我有一个音频应用程序并已实现 CarPlay 我已按照本指南添加 CarPlay 支持 https blog fethica com add carplay support to swiftradio https blog fethica
  • 您在开发中如何处理 SSL?

    我有一个应用程序 它的一些路由与ssl 要求 http github com rails ssl requirement插入 它已部署并且在生产中运行良好 问题是如何在开发中最好地处理这个问题 因为目前我只是简单地破解我的routes rb
  • 使用php从h1标签获取所有值

    我想接收一个包含文本中所有 h1 标签值的数组 例如 如果给定的输入字符串 h1 hello h1 p random text p h1 title number two h1 我需要接收一个包含以下内容的数组 titles 0 hello
  • SQL Reporting Services - Mozilla 中未显示打印按钮

    我在用SQL 报告服务 它工作正常并显示打印按钮IE 但在 Mozilla Firefox 中未显示 有人有什么主意吗 我已经检查过这个解决方案 但它不起作用 http social msdn microsoft com Forums en
  • 网络直径是什么意思?

    上图所示这个链接 http en wikipedia org wiki Vertex 28graph theory 29的 具有 6 个顶点和 7 个边的图 其中最左侧的 6 号顶点是叶顶点或下垂顶点 有直径4吗 对还是错 定义是 图的直径
  • Sequelize关系查询返回重复数据

    我正在使用 Sequelize 关系查询指定客户的客户订单 index js var results2 await customerService getOrders 1 console log results2 服务 js exports
  • Firefox 中的大子字符串比 Chrome 快约 9000 倍:为什么?

    基准 http jsperf com substringing http jsperf com substringing 因此 我正在启动我的第一个基于 HTML5 浏览器的客户端项目 本质上 它必须将非常非常大的文本文件解析为一个或多个对