为什么 Web Worker 性能在 30 秒后急剧下降?

2024-05-17

我正在尝试提高在网络工作人员中执行时脚本的性能。它旨在解析浏览器中的大型文本文件而不会崩溃。一切都运行得很好,但我注意到使用网络工作者时大文件的性能存在严重差异。

于是我做了一个简单的实验。我在同一输入上运行脚本两次。第一次运行在页面的主线程中执行脚本(没有网络工作者)。当然,这会导致页面冻结并变得无响应。对于第二次运行,我在网络工作者中执行了脚本。

  • 正在执行的脚本 https://github.com/mholt/jquery.parse/blob/version3/papaparse.js
  • 测试运行页面 https://github.com/mholt/jquery.parse/tree/version3/player

对于本实验中的小文件 (

蓝线是预期的。解析文件只需要大约 11 秒,并且性能相当稳定:

红线是网络工作者内部的性能。更令人惊讶的是:

前 30 秒的锯齿线是正常的(锯齿是由于解析文件的每个块后将结果发送到主线程的轻微延迟造成的)。然而,解析速度在 30 秒时突然减慢。 (请注意,我只使用一个 Web Worker 来完成这项工作;一次不会使用多个工作线程。)

我已经确认延迟是not将结果发送到主线程postMessage()。放缓是在紧密的循环 https://github.com/mholt/jquery.parse/blob/version3/papaparse.js#L873解析器的,它是完全同步的。由于我无法解释的原因,该循环速度大大减慢,并且在 30 秒后随着时间的推移变得更慢。

但这只发生在网络工作者身上。正如您在上面所看到的,在主线程中运行相同的代码运行得非常平稳和快速。

为什么会发生这种情况?我可以做什么来提高性能? (我不希望任何人完全理解该文件中的所有 1,200 多行代码。如果您这样做了,那就太棒了,但我感觉这与网络工作人员比我的代码更相关,因为它在主程序中运行良好线。)

系统:我在 Mac OS 10.9.4 上运行 Chrome 35,内存为 16 GB;四核 2.7 GHz Intel Core i7,具有 256 KB L2 高速缓存(每核)和 6 MB L3 高速缓存。文件块的大小约为 10 MB。

Update:刚刚在 Firefox 30 上尝试了一下,确实如此not在工作线程中遇到同样的减速(但在主线程中运行时比 Chrome 慢)。然而,尝试使用更大的文件(大约 1 GB)进行相同的实验,在大约 35-40 秒后(看起来),速度显着减慢。


泰勒·奥尔特 (Tyler Ault) 在 Google+ 上提出了一种可能性 https://plus.google.com/+MatthewHolt/posts/BPuXy3rYc58事实证明这非常有帮助。

他推测使用FileReaderSync在工作线程中(而不是普通的异步FileReader)没有提供垃圾收集发生的机会。

更改要使用的工作线程FileReader异步(直观上看起来像是一个性能步骤向后)将这个过程加速到仅 37 秒,正是我所期望的。

我还没有收到泰勒的回复,我也不完全确定我理解为什么垃圾收集会成为罪魁祸首,但是关于FileReaderSync was 彻底地减慢代码速度。

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

为什么 Web Worker 性能在 30 秒后急剧下降? 的相关文章

随机推荐

  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 在 Rust 中,太大的位移是否是未定义的行为?

    当您运行此代码时 allow exceeding bitshifts fn main const NUMBER u64 0b 10101010 fn print shift i u32 println b NUMBER gt gt i pr
  • “不等于”的 F# 语法是什么?

    在 C 代码中 它会是这样的 if c 0 some code 那么在 F 中呢 From MSDN 有关 F 算术运算符的页面 http msdn microsoft com en us library dd469493 aspx 看起来
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 计算机视觉/道路跟踪入门

    我想开发一个可以跟踪和沿着道路行驶的系统 最初 我只想处理定义明确的道路 稍后可能会合并对定义不明确的道路的跟踪 我面临的问题是我不知道从哪里开始 我是图像处理领域的新手 我希望能得到一些关于从哪里开始以及应该阅读哪些关于该主题的书籍的指导
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 如何在 Spring 属性中进行算术运算?

  • 如何将 LC_LOAD_DYLIB 命令插入 Mach-O 二进制文件或将静态库加入现有二进制文件 (IOS)

    这是我第一次在 stackoverflow 上提问 我很绝望 我的任务是加载 dylib 或将静态库加入到 IOS 设备的现有可执行文件中 我将使用static void attribute constructor initialize v
  • 如何仅在使用 ffmpeg 添加相同速度的分离音频流时更改视频速度?

    我正在使用 ffmpeg 作为视频过滤器 但是 当我改变视频速度时 我遇到了问题 音频比视频长 ffmpeg i INPUT mp4 filter v setpts 0 5 PTS shortest y preset ultrafast O
  • 如何在CSS中制作一个带有边框的可调整大小的心形

    我想要制作一个心形 用户可以将其大小调整为任意宽度和高度 并且边框为 1 像素 我尝试了用纯 CSS 制作的心形 https stackoverflow com a 17386187 1404447 https stackoverflow
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 使用 RunAs 启动 chrome 时出现“Chrome 旧版窗口”

    我正在尝试使用 MSAA 在 Win7 上 获取 chrome 浏览器中的地址栏并将其替换为不同的 url 当 chrome 正常启动时 作为登录用户 我可以通过遍历进程拥有的窗口类的 UI 树 使用 IAccessible 接口找到地址栏
  • 由枚举驱动的 SwiftUI 选择器:值未更新

    根据苹果公司的相关文档SwiftUI 中使用 Enum 的选取器 https developer apple com documentation swiftui picker 如果枚举符合Identifiable协议除了CaseIterab
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 如何使用 Core Graphics 在我的触摸位置绘制一个圆圈?

    新程序员来了 我在尝试使用 Core Graphics 在触摸位置周围绘制描边弧时遇到问题 我有绘制圆圈的方法工作正常 并且我已经测试并在点击屏幕时注册触摸 但是当我尝试在点击时调用绘制圆圈的方法时 我收到错误 CG ContextBlah
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程