Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript web workers多线程字符串搜索比单线程慢?_Javascript_Multithreading_Performance_Web Worker - Fatal编程技术网

javascript web workers多线程字符串搜索比单线程慢?

javascript web workers多线程字符串搜索比单线程慢?,javascript,multithreading,performance,web-worker,Javascript,Multithreading,Performance,Web Worker,我有一个模糊搜索函数。我有52k个单词的列表。我正在对每个单词运行函数。完成大约需要30秒 我尝试使用myWorker.postMessage({targets:slice,search})将列表的1/8发送给每个工作线程(我的cpu上有8个线程),将其拆分为8个web工作线程。但这要慢得多,大约100毫秒 我的问题是:多线程在这里是否可能更快?或者只是复制了太多的数据而无法在30毫秒内完成?是否可以不复制内存而使用某种共享内存? (似乎只是简单地将数据发送给工作人员比我在一个线程中搜索所有数据

我有一个模糊搜索函数。我有52k个单词的列表。我正在对每个单词运行函数。完成大约需要30秒

我尝试使用
myWorker.postMessage({targets:slice,search})
将列表的1/8发送给每个工作线程(我的cpu上有8个线程),将其拆分为8个web工作线程。但这要慢得多,大约100毫秒

我的问题是:多线程在这里是否可能更快?或者只是复制了太多的数据而无法在30毫秒内完成?是否可以不复制内存而使用某种共享内存?

(似乎只是简单地将数据发送给工作人员比我在一个线程中搜索所有数据要慢!)

有没有可能不复制内存并进行某种共享 记忆

您可以将
Worker.postMessage()
的第二个参数从
Worker
线程到主线程,或从主线程到工作线程,用于创建的对象

// transfer data to `Worker` instance
worker.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`

Google Chrome 17+和Firefox 18+包含了一种额外的传递方式 某些类型的对象(可转让对象,即 实现接口)与具有 高性能。可转让的对象从一个 使用零复制操作将上下文复制到另一个上下文,这将导致 发送大型数据集时的性能改进


只是一个猜测,但可能速度较慢,因为您正在处理的数据相对较小,因此增加新员工的开销不值得。如果您使用
myWorker.postMessage({targets:slice,search})
“为什么代码不将对象传输到主线程?@guest271314”来处理500k个单词,您会很感兴趣地了解其处理速度?这将主线程的1/8数据(切片)提供给worker@StephenBugsKamenar是的,尽管有问题的代码没有将在
Worker
创建的对象从
Worker
线程传输到主线程。@FuzzyTree single需要100毫秒。线程化需要200毫秒。线程化的速度似乎始终是数据量的两倍。听起来不错。给我几分钟测试一下,看起来我需要使用arraybuffer。我不知道如何将字符串数组转换为arraybuffer@StephenBugsKamenar您可以使用
Blob
FileReader.protype.readAsArrayBuffer()
FileReader.prototype.readAsText()
TextEncoder()
TextDecoder()
Uint8Array()
将文本编码和解码为
类型Darray
其中
.buffer
属性:
ArrayBuffer
可访问
var arr=[“abc”、“bac”、“cab”];arr.forEach(函数{var encoder=new textcoder();var decoder=new textcodector();var encoded=encoder.encode;var decoded=decoder.decode(new Uint8Array(encoded.buffer));console.log(encoded,decoded)}
代码示例工作正常
encoder.encode(slice.join(String.fromCharCode(0))
这将整个字符串数组转换为可以传输的缓冲区。但是,重新格式化数据以便将其提供给线程的过程仍然比单线程处理慢(虽然看起来稍微快一些),您可以尝试在
Worker
中使用
FileReaderSync
。考虑到创建
TextEncoder
TextDecoder
的新实例不符合要求。
// transfer data from `Worker` instance
self.postMessage(data.buffer, [data.buffer]) // where `data` is an `ArrayBuffer`