【发布时间】:2018-04-09 13:53:02
【问题描述】:
为了让自己熟悉网络工作者,我编写了一个小测试,其中添加了 2 个数组元素。目标数组中的位置分配给 4 个工作人员。我想衡量表现并经历了一次粗鲁的觉醒。
///init///
const workers = new Array(4), global_elements = 250000;
function createArray(value, elements) {
return new Int8Array(elements).fill(value);
}
let a = createArray(1, global_elements), b = createArray(2,global_elements), c = createArray(0,global_elements), data_recived = 0;
window.URL = window.URL || window.webkitURL;
for(let i=0; i<4; ++i) {
let response = `self.onmessage=function(e){
for(let i=${i*global_elements}; i<${i*global_elements+global_elements}; ++i) {
e.data[2][i] = e.data[0][i] + e.data[1][i];
}
postMessage(0);
}`;
workers[i] = new Worker(URL.createObjectURL(new Blob([response], {type: 'application/javascript'})));
workers[i].onmessage = function(e) {
if(++data_recived === 4) {
t1 = performance.now();
console.log(t1-t0);
}
};
}
///end-init///
//normal
let t0 = performance.now();
for(let i=0; i<global_elements; ++i) {
c[i] = a[i] + b[i];
}
let t1 = performance.now();
console.log(t1-t0);
//worker
t0 = performance.now();
for(let i=0; i<4; ++i) {
workers[i].postMessage([a,b,c]);
}
可悲的是,这里的工人甚至无法随着 global_elements 数量的增加而得分。
元素:正常 |工人
2500: 0.1 | 51.4
25000:1.5 | 66.5
250000:4.1 | 182
(我知道性能测试不是最优的。)
为什么我的网络工作者表现如此糟糕?
【问题讨论】:
-
逐元素乘法并没有太多工作。将数据作为消息传递给工作人员可能比乘法更多地工作。
-
SIMD 在这里更合适。
-
很遗憾,SIMD 几乎不可用。
-
您为什么希望它们表现出色? Web Worker 非常适合在旁边运行昂贵的东西,因此它不会阻塞,但它不会使昂贵的东西更快。
标签: javascript performance performance-testing web-worker