我有一个模糊搜索功能。我有一个52k字的列表。我正在针对每个单词运行该功能。完成大约需要30ms。
我尝试通过使用myWorker.postMessage({targets:slice, search})
向每个工作人员(我的cpu上有8个线程)发送1/8的列表,将其拆分为8个Web工作线程。但这要慢得多,大约100毫秒。
我的问题是:多线程是否有可能在这里更快?或者只是太多的数据要复制到30ms以下的线程完成?有可能不复制内存并拥有某种共享内存吗?
(似乎只是简单地向工作人员发送数据比我实际搜索1个线程中的所有数据要慢!)
答案 0 :(得分:2)
是否可以不复制内存并进行某种共享 存储器?
您可以使用MyClass::MyClass(std::string path)
: my_variable_name(
[&]() -> some_namespace::some_class_name
{
// do work here and return desired value
string other = "jwrhkfg";
if (path="site.com") {
other = "oritrot";
} else {
other = "hsghkr";
}
return some_namespace::some_class_name(path+other);
}() /*call lambda immediately*/ )
{}
的第二个参数transfer创建的对象从Worker.postMessage()
线程到主线程,或者从主线程到工作线。
Worker
// transfer data to `Worker` instance
worker.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`
<强> Passing data by transferring ownership (transferable objects) 强>
Google Chrome 17+和Firefox 18+包含另一种传递方式 某些类型的对象(可转移对象,即对象 向工作人员或从工作人员实施Transferable接口) 高性能。可转移对象从一个转移 具有零拷贝操作的另一个上下文,这导致了巨大的 发送大型数据集时性能提升。