为什么网络工作者的性能在30秒后急剧下降?

马特

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

所以我进行了一个简单的实验。我在同一输入上运行了两次脚本。第一次运行在页面主线程中执行了脚本(没有Web Worker)。自然,这将导致页面冻结并变得无响应。对于第二次运行,我在Web Worker中执行了脚本。

对于本实验中的小文件(<〜100 MB),性能差异可以忽略不计。但是,在大文件上,解析工作线程所需的时间大约是原来的20倍:

两种方案在同一图表上的性能

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

没有网络工作者的脚本性能

红线是网络工作人员内部的表现。更令人惊讶的是:

Web Worker中脚本的性能

前30秒的锯齿状线是正常现象(锯齿现象是由于在解析文件的每个块之后将结果发送到主线程中的轻微延迟引起的)。但是,解析会在30秒后突然变慢。(请注意,我只使用一个Web工作者进行该工作;一次最多只能使用一个工作者线程。)

我已经确认延迟不是使用将结果发送到主线程postMessage()减速器处于解析器的紧密循环中,该循环是完全同步的。由于我无法解释的原因,该循环会大大减慢速度,并且在30秒后会随着时间的推移而变慢。

但这仅在网络工作者中发生。如上所见,在主线程中运行相同的代码可以非常平稳,快速地运行。

为什么会这样呢?我该怎么做才能提高性能?(我不希望有人能完全理解该文件中的所有1200多行代码。如果您这样做,那真是太棒了,但是我觉得这比Web工作人员更重要,而不是我的代码,因为它在主代码中运行正常线。)

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

更新:刚在Firefox 30上尝试过,它在工作线程中没有遇到相同的速度下降(但是在主线程中运行时,它比Chrome慢)。但是,尝试使用更大的文件(大约1 GB)进行相同的实验会在大约35-40秒后(看来)显着降低速度。

马特

泰勒·奥尔特(Tyler Ault)在Google+上提出了一种可能性,事实证明它很有帮助。

他推测FileReaderSync在工作线程中使用(而不是普通的ol'async FileReader)并没有提供进行垃圾收集的机会。

更改工作线程以FileReader异步使用(从直觉上看,这似乎是性能上的倒退),将过程加速到仅37秒,恰好是我期望的那样。

我还没有收到Tyler的回音,我也不完全确定我理解为什么垃圾回收是罪魁祸首,但是有关的事情FileReaderSync大大降低了代码的速度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么以其他用户身份运行命令时性能急剧下降

来自分类Dev

为什么当记录> 600左右时查询性能急剧下降

来自分类Dev

Azure VM磁盘性能急剧下降

来自分类Dev

为什么通过缓存c ++访问静态ram的速度急剧下降?

来自分类Dev

为什么memcpy()的速度每4KB急剧下降?

来自分类Dev

使用backtrack选项时,编译器的性能急剧下降

来自分类Dev

网络工作者与承诺

来自分类Dev

网络工作者的错误

来自分类Dev

网络工作者的setTimeout

来自分类Dev

网络工作者的错误

来自分类Dev

什么是网络工作者以及何时使用它们

来自分类Dev

什么是网络工作者以及何时使用它们

来自分类Dev

成功注册服务工作者后,为什么没有点击ServiceWorkerRegistration回调?

来自分类Dev

网络工作者访问dom

来自分类Dev

BreezeJs和专门的网络工作者

来自分类Dev

Azure主题工作者角色在60秒后停止处理消息

来自分类Dev

与网络工作者一起使用require.js的正确方法是什么?

来自分类Dev

有什么办法可以在网络工作者关闭之前执行操作?

来自分类Dev

当我在网络工作者上终止呼叫时,它处于什么状态?

来自分类Dev

JS-网络工作者如何工作?

来自分类Dev

30分钟后性能下降

来自分类Dev

为什么要重新初始化多进程工作者?

来自分类Dev

Ember-cli项目和网络工作者

来自分类Dev

使用网络角色和工作者角色

来自分类Dev

网络工作者处理AJAX调用-优化过度?

来自分类Dev

在网络工作者中使用Google地图对象?

来自分类Dev

是否可以从JavaScript网络工作者调用ActionScript函数?

来自分类Dev

使用网络工作者冻结对象

来自分类Dev

网络工作者和参考错误

Related 相关文章

热门标签

归档