javascript web worker 多线程字符串搜索比单线程慢?
javascript web workers multithreaded string search slower than single thread?
我有模糊搜索功能。我有一个 52k 单词的列表。我是 运行 针对每个单词的函数。大约需要 30 毫秒才能完成。
我尝试使用 myWorker.postMessage({targets:slice, search})
将列表的 1/8 发送给每个工作线程(我的 cpu 上有 8 个线程),将其拆分为 8 个 Web 工作线程。但这要慢得多,大约 100 毫秒。
我的问题是:这里多线程是否有可能更快?还是在 30 毫秒线程内完成复制的数据太多了?是否可以不复制内存并拥有某种共享内存?
(似乎只是简单地将数据发送给工作人员比我实际在 1 个线程中搜索所有数据慢!)
is it possible to not copy the memory and have some kind of shared
memory?
您可以使用 Worker.postMessage()
的第二个参数来 transfer 从 Worker
线程到主线程,或从主线程到工作线程的创建对象。
// transfer data to `Worker` instance
worker.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`
// transfer data from `Worker` instance
self.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`
Passing data by transferring ownership (transferable objects)
Google Chrome 17+ and Firefox 18+ contain an additional way to pass
certain types of objects (transferable objects, that is objects
implementing the Transferable interface) to or from a worker with
high performance. Transferable objects are transferred from one
context to another with a zero-copy operation, which results in a vast
performance improvement when sending large data sets.
我有模糊搜索功能。我有一个 52k 单词的列表。我是 运行 针对每个单词的函数。大约需要 30 毫秒才能完成。
我尝试使用 myWorker.postMessage({targets:slice, search})
将列表的 1/8 发送给每个工作线程(我的 cpu 上有 8 个线程),将其拆分为 8 个 Web 工作线程。但这要慢得多,大约 100 毫秒。
我的问题是:这里多线程是否有可能更快?还是在 30 毫秒线程内完成复制的数据太多了?是否可以不复制内存并拥有某种共享内存?
(似乎只是简单地将数据发送给工作人员比我实际在 1 个线程中搜索所有数据慢!)
is it possible to not copy the memory and have some kind of shared memory?
您可以使用 Worker.postMessage()
的第二个参数来 transfer 从 Worker
线程到主线程,或从主线程到工作线程的创建对象。
// transfer data to `Worker` instance
worker.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`
// transfer data from `Worker` instance
self.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`
Passing data by transferring ownership (transferable objects)
Google Chrome 17+ and Firefox 18+ contain an additional way to pass certain types of objects (transferable objects, that is objects implementing the Transferable interface) to or from a worker with high performance. Transferable objects are transferred from one context to another with a zero-copy operation, which results in a vast performance improvement when sending large data sets.