【发布时间】:2017-03-12 22:17:25
【问题描述】:
我正在开发一个使用网络工作者的项目。似乎工人正在产生相当多的额外垃圾,必须从消息传递中收集。
我正在通过主线程的 post 消息向工作人员发送三件事。第一个只是一个数字,第二个是一个包含 7 个数字的数组,第三个是日期。前两个是对象的属性,如下所示。这在 RAF 上每 16 毫秒调用一次,用于大约 20 个对象。 GC 最终每 2 秒左右收集 12MB。我想知道是否有办法做到这一点而不会产生这么多垃圾?感谢您的帮助!
//planet num (property of object) is just a number like: 1
//planetele looks like this (property of an object)
//[19.22942, 313.4868, 0.04441, 0.7726, 170.5310, 73.9893, 84.3234]
//date is just the date object
//posted to worker like so:
planetWorker.postMessage({
"planetnum": planet.num,
"planetele": planet.ele,
"date": datet
});
//the worker.js file uses that information to do calculations
//and sends back the planet number, with xyz coordinates. (4 numbers)
postMessage({data: {planetnum : planetnum, planetpos: planetpos}});
【问题讨论】:
-
有多少工人?有多少不同的行星被操纵?这似乎是一个很有希望的起点:nolanlawson.com/2016/02/29/high-performance-web-worker-messages
-
我有两个工人,一个用于 9 个行星,然后以同样的方式处理更多的小行星。现在我只是想弄清楚如何用 1 名工人来处理垃圾。
-
那篇文章读得很好,我一定会试试看的。不过,它似乎不会减少复制带来的垃圾。我认为 arraybuffer 可能会有所帮助,但不确定我是否可以将它与对象属性一起使用?
-
如果你想要零分配消息,你需要
SharedArrayBuffer。如果你想要低分配开销,你需要将 arraybuffers 作为 transferable 参数传递,并在它们被发回时回收它们。 -
无论如何,如果您考虑到每秒有 60 帧并且消息传递可能涉及内部字符串化,那么 6MB/s 并不算多。所以即使一切都是最优的,你仍然会期望几十 KB/s
标签: javascript garbage-collection garbage