【发布时间】:2015-07-15 12:04:36
【问题描述】:
我创建了一个非常简单的场景,我发现了一个我无法理解的非常奇怪的行为。
在以下链接下,我创建了一个顺序实现: 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();
有人知道为什么会这样吗?
编辑:这个问题与其他问题不同,因为原因可能是缓存问题。我该如何解决这个缓存问题?
【问题讨论】:
-
这很快就关闭了。另一个问题非常不具体,例如“有时速度较慢”。 这里,可以期待更多有趣的答案....
-
重新打开了这个问题,因为它正在寻找更具体的问题代码。
标签: java multithreading parallel-processing threadpool executorservice