Я создал очень простой сценарий, где я узнал действительно странное поведение, которое я не могу понять.Последовательная реализация Java в 4 раза быстрее, чем параллельная реализация
По следующей ссылке я создал последовательную реализацию: 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();
Кто-нибудь есть идея, почему это происходит?
Редактировать: Эта проблема отличается от других, потому что причина, по-видимому, является проблемой кэширования. Как я могу решить эту проблему кэширования?
Это было закрыто довольно быстро. Другой вопрос очень неспецифичен, например «иногда что-то медленнее». * Здесь *, можно было ожидать более интересных ответов .... – Marco13
Открыл вопрос, поскольку он ищет нечто более специфичное для данного кода. –