我一直在努力优化一些长期运行的JAvaScript,并尝试实现WebWorkers.
我有一组独立的计算任务.在我的初始测试中有80个任务,并且在主线程上完成250ms.我认为我可以将任务分配给一些网络工作者,并将时间缩短到50毫秒.
我的数据是嵌套多个类型数组的几何数据结构.我有方法将所有数据提取到JSON +一个ArrayBuffer对象数组,因此我可以将数据传递给WebWorker,而无需复制大数组.
这是我的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上下文生成我的引擎的最小版本.
谢谢你的任何提示......
我正在使用Node.js为Web应用程序设计架构,我们需要能够从库中将中等大小的文件发送到客户端.当用户浏览图库时,他们将尽快发送这些二进制文件(对于每个图库项目).文件可能高达6Mb,但可能平均大约2Mb.
我的客户坚持认为我们应该使用websockets进行数据传输而不是XHR.需要明确的是,我们不需要双向通信.
我缺乏这个领域的经验,在我的推理中需要帮助.到目前为止,我的观点如下:
是否有任何技术论据支持/反对使用websockets进行标准HTTPRequests上的纯数据传输.任何人都可以取消/澄清我的观点,并可能提供链接来帮助我的研究吗?
我发现此链接非常有用:https://www.mnot.net/cache_docs/#PROXY
我有一个只有几个月的项目,我决定在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.