小编Phi*_*lor的帖子

WebWorkers执行似乎比主线程慢得多

我一直在努力优化一些长期运行的JAvaScript,并尝试实现WebWorkers.

我有一组独立的计算任务.在我的初始测试中有80个任务,并且在主线程上完成250ms.我认为我可以将任务分配给一些网络工作者,并将时间缩短到50毫秒.

我的数据是嵌套多个类型数组的几何数据结构.我有方法将所有数据提取到JSON +一个ArrayBuffer对象数组,因此我可以将数据传递给WebWorker,而无需复制大数组.

  • 我已经测试了数据传输,并确认它正在按预期工作.传输到WebWorker后,我的Typed数组在主线程中为空.
  • 我预先启动(现在)4名网络工作人员,这样当需要完成工作时,工作人员应该做好准备.
  • 当每个工作人员完成一项任务时,我会在队列中为其提供下一个任务,直到队列为空.
  • 我在Web工作者中跟踪时间,以查看在实际计算中使用了多少(例如,忽略数据传输开销).
  • 我有一台8核笔记本电脑,每天运行多线程代码.

这是我的WebWorker脚本.

importScripts('../lib/MyLib.js');

let timeComputing = 0;  
this.onmessage = function(e) {
  switch (e.data.msg) {
    case 'compute':
        let mesh = ... unpack data;
        let start = performance.now();
        mesh.doexpensiveCompute();
        timeComputing += performance.now() - start;
        ... send data back to the main thread.
        break;
    case 'logTime':
        console.log("timeComputing:" + timeComputing);
  }
}
Run Code Online (Sandbox Code Playgroud)

当工人记录使用的时间时,通常每个工人约130ms,这意味着总时间实际上接近500ms.主线程在250ms内完成所有工作,所以使用WebWorkers我会慢100%.出于某种原因,在WebWorker中运行的完全相同的代码比在主线程上运行的代码要慢得多.

我很快就会有一些工作量可能有数百个任务,所以我希望WebWorkers可以保持我的页面响应.(目前它在大负荷下根本没有).

有人会有什么建议,为什么我看到这样糟糕的结果?注意:我已经消除了数据传输的成本(我相信这是最小的)和线程启动.我纯粹是在测量工作人员的计算时间,这很差......有没有人有经验在网络工作者中运行繁重的计算任务?

一个想法是,我的工作脚本也加载我的主引擎脚本.(示例代码中的MyLib.js),这是一个Webpacked脚本,非常大.我使用了这个,所以希望浏览器缓存意味着它不需要再次请求它.也许我应该为webworker上下文生成我的引擎的最小版本.

谢谢你的任何提示......

javascript performance web-worker

7
推荐指数
1
解决办法
1373
查看次数

WebSockets与XHR进行数据传输

我正在使用Node.js为Web应用程序设计架构,我们需要能够从库中将中等大小的文件发送到客户端.当用户浏览图库时,他们将尽快发送这些二进制文件(对于每个图库项目).文件可能高达6Mb,但可能平均大约2Mb.

我的客户坚持认为我们应该使用websockets进行数据传输而不是XHR.需要明确的是,我们不需要双向通信.

我缺乏这个领域的经验,在我的推理中需要帮助.到目前为止,我的观点如下:

  • 使用WebSockets可以破坏HTTP提供的任何客户端缓存.如果用户两次访问图库中的相同项目,则会被迫重新下载内容.
  • WebSocket消息无法通过/路由到代理缓存来处理.它们必须始终由显式服务器处理.
  • CDN旨在提供广泛的Web缓存,拦截HTTP请求.WebSockets限制我们利用CDN.
  • 我猜Nodejs能够比并发websocket连接更快地响应数百/数千XHR.

是否有任何技术论据支持/反对使用websockets进行标准HTTPRequests上的纯数据传输.任何人都可以取消/澄清我的观点,并可能提供链接来帮助我的研究吗?

我发现此链接非常有用:https://www.mnot.net/cache_docs/#PROXY

javascript xmlhttprequest node.js

6
推荐指数
1
解决办法
2901
查看次数

使用webpack而不将es6转换为es5代码

我有一个只有几个月的项目,我决定在ES6中编写它以学习新系统.(我很喜欢).该项目是一个复杂的WebGL渲染器.

最初我只是在浏览器中使用es6(不使用模块功能),只是在我的HTML中使用了很多import语句(丑陋).随着课程数量的增加,这变得无法控制.

现在我第一次学习webpack和babel.我的目标是将所有模块以es5或es6格式组合在一起.

我使用webpack将我的代码转换为单个es5(CommonJS)模块.所有功能都保持不变.好极了!

但是,在某些情况下,性能已经大大降低.我的一些代码运行速度只有它已转换为es5的一半.(这违反了我在本页中看到的数据https://kpdecker.github.io/six-speed/).

我想使用Webpack测试而不转换es6 - > es5.基本上只是利用webpacks将我的模块捆绑到一个文件中的能力.

我对webpack完全不熟悉,而且我一直试图弄乱babel转换代码的方式,但无法弄清楚如何简单地禁用大多数转换.我唯一想要转变的是模块导入/导出.

任何人都可以帮我解决这个问题吗?

PS我认为我的项目指出es6在某些现实世界的用例中要比es5快得多,并且有助于证明我决定从一开始就使用es6.

ecmascript-6 webpack babeljs es6-module-loader

6
推荐指数
2
解决办法
3660
查看次数