Это, наверное, довольно простой вопрос, но поскольку я никогда не работал с потоками, прежде чем я понял, что лучше спросить, а не пытаться найти оптимальное решение самостоятельно.Java - многопоточная одна большая петля
У меня есть гигантский цикл for
, который работает буквально в миллиарды раз. При каждом запуске цикла в соответствии с текущим index
программа вычисляет конечный результат в виде числа. Меня интересует только хранение верхнего result
(или верхних х результатов) и его соответствующего индекса.
Мой вопрос прост, каков был бы правильный способ запуска этого цикла в потоках, чтобы он использовал все доступные процессоры/ядра.
int topResultIndex;
double topResult = 0;
for (i=1; i < 1000000000; ++i) {
double result = // some complicated calculation based on the current index
if (result > topResult) {
topResult = result;
topResultIndex = i;
}
}
Расчет полностью независим для каждого индекса, ресурсы не используются. topResultIndex
и topResult
, очевидно, будут доступны каждому потоку.
* Обновление: Оба решения Giulio и rolfl являются хорошими, также очень похожими. Могло принять только один из них в качестве моего ответа.
Является ли расчет независимым для каждого индекса или будут ли разделяемые ресурсы для расчетов? – Jeffrey
Расчет полностью независим для каждого индекса – SportySpice
Если цикл связан с ЦП, многопоточность * будет * увеличивать его скорость (в соответствии с законом Амдаля). Он не будет работать, если узким местом является память (потому что многопоточность не заставит оперативную память работать быстрее) –