我需要多次(> 10,000)次计算一个数学密集型函数。我以为我可以使用网络工作者来减少计算时间。
我正在使用一个函数,该函数创建函数的Blob,将其执行包装在Promise中,并在Blob处运行Web Worker。我对其进行了测试,并且可以运行,但运行速度明显比单线程方法慢。
单线程:3毫秒 多线程:5524毫秒
包括时间测试在内的完整代码:
https://codepen.io/zakerytclarke/pen/BgRyBm?editors=0012
此代码计算前n个平方并将其推入数组。控制台显示运行单线程和多线程的相应时间。
这是我用来使Web Worker散布的功能。是不是有什么问题导致执行时间远远超出了简单的for循环?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count = 0;
int row = 5;
int column = 9;
int offset = 0;
for (int outer = 0; outer <= row; outer++)
{
for(int inner = offset; inner <= column; inner++)
{
if(count>=50){
break;
}
printf("%9d", count); // tab spaces between colums
count++;
}
printf("\n"); // new lines
}
return (0);
}
感谢您的帮助。
以下是有关我CPU的信息:
function thread(fn){ return function(args){ return new Promise(function(resolve) { var worker=new Worker(URL.createObjectURL(new Blob(['('+fn+')('+JSON.stringify(args)+')']))); worker.postMessage(args) worker.onmessage = function(event){ resolve(event.data); worker.terminate(); }; }); } }
答案 0 :(得分:1)
您忽略了网络工作者的繁重开销。难怪您的代码通过对函数进行字符串化来创建Blob,从该文件中创建工作线程,解析该工作线程的代码,实例化Promise,发送消息,设置侦听器,并异步等待该工作线程的结果,比两次双倍的乘法慢几千倍。实际上,令您惊讶的是,您甚至仅在5秒钟内就产生了10000名工人。
This benchmark估计设置一个工作程序大约需要40毫秒。因此,不,工作人员不是轻量级线程,您应该为任何事情产生这些线程。它们被称为工作线程,您应该向它们发送(许多)消息以进行处理和响应。您可能想要创建一个工作池,以将负载分散到多个线程上。
当然,对于您的square
函数,这都不适用。它太小-仅执行一次乘法。在主线程上执行此操作的速度将比与另一个线程进行通信的速度更快。如果您在该函数中有一个100000个项目的循环,则可能值得在后台线程中运行该循环。所获得的3ms单线程性能甚至不会明显阻塞主线程。