在下面的链接中,我创建了一个顺序实现: http://ideone.com/B8JYeA 基本上有几个具有固定大小的大数组。算法遍历它们并更改值。
for(int i = 0; i < numberOfCells; i++) {
h0[i] = h0[i] + 1;
h1[i] = h1[i] + 1;
h2[i] = h2[i] + 1;
h3[i] = h3[i] + 1;
h4[i] = h4[i] + 1;
}
如果我在我的工作站上运行它,大约需要5秒钟。
我实现了一个并行版本。8个线程同时运行它。代码应该是线程安全的,并且线程之间没有依赖关系。
但是在我的工作站上,代码仍然运行得比较慢,大约慢了4倍: http://ideone.com/yfwVmr
final int numberOfThreads = Runtime.getRuntime().availableProcessors();
ExecutorService exec = Executors.newFixedThreadPool(numberOfThreads);
for(int thread = 0; thread < numberOfThreads; thread++) {
final int threadId = thread;
exec.submit(new Runnable() {
@Override
public void run() {
for(int i = threadId; i < numberOfCells; i += numberOfThreads) {
h0[i] = h0[i] + 1;
h1[i] = h1[i] + 1;
h2[i] = h2[i] + 1;
h3[i] = h3[i] + 1;
h4[i] = h4[i] + 1;
}
}
});
}
exec.shutdown();
有人知道为什么会出现这种情况吗?
编辑:这个问题与其他问题不同,因为原因可能是缓存问题。我该如何解决这个缓存问题?