假设我们有几百万行必须解析的长文本。
在我的 i7 2600 CPU 上,每 1000 行解析大约需要 13 毫秒。
因此,解析 1,000,000 行大约需要 13 秒。
为了减少执行时间,我已经使用多个线程进行了管理。
使用阻塞队列,我将 1,000,000 行推送为一组 1000 个块,每个块包含 1000 行,并使用 8 个线程使用这些块。代码很简单,似乎可以正常工作,但是性能并不令人鼓舞,大约需要 11 秒。
这是多线程代码的主要部分:
for(int i=0;i<threadCount;i++)
{
Runnable r=new Runnable() {
public void run() {
try{
while (true){
InputType chunk=inputQ.poll(10, TimeUnit.MILLISECONDS);
if(chunk==null){
if(inputRemains.get())
continue;
else
return;
}
processItem(chunk);
}
}catch (Exception e) {
e.printStackTrace();
}
}
};
Thread t=new Thread(r);
threadList.add(t);
for(Thread t: threads)
t.join();
我也使用过 ExecutorService 但性能更差!
更改块大小也无济于事,性能也没有提高。
这意味着阻塞队列不是瓶颈。
另一方面,当我同时运行 4 个串行程序实例时,所有 4 个实例只需要 15 秒即可完成。这意味着我可以在 15 秒内使用 4 个进程处理 4,000,0000 行,因此,与多线程的 1.2 加速相比,速度提升在 3.4 左右,这是非常有希望的。
我想知道有人对此有任何想法吗?
问题很简单:阻塞队列中的一组行和几个线程从队列中轮询项目并并行处理它们。队列最初已填满,因此线程完全忙碌。
我以前也有类似的经历,但我不明白为什么多处理更好。
我还应该提到我在 Windows 7 上运行测试并使用 1.7 JRE。
欢迎任何想法,并在手前感谢。