Я пишу довольно интенсивный процессор, параллельный числовой код, который будет обрабатывать большие объемы данных, хранящихся в массивах Java (например, много двойных [100000] с).Некоторые из алгоритмов могут выполняться миллионы раз в течение нескольких дней, поэтому достижение максимальной производительности в стационарном режиме является высоким приоритетом.
По сути, каждый алгоритм является объектом Java, который имеет API метода, похожий на:
public double[] runMyAlgorithm(double[] inputData);
или, альтернативно, в массив можно передать ссылку для хранения выходных данных:
public runMyAlgorithm(double[] inputData, double[] outputData);
Учитывая это требование, я пытаюсь определить оптимальную стратегию для выделения / управления пространством массива,Часто алгоритмам требуется большое количество места для временного хранения.Они также будут принимать большие массивы в качестве входных данных и создавать большие массивы в качестве выходных.
Среди вариантов, которые я рассматриваю:
- Всегда выделяйте новые массивы как локальные переменные, когда они необходимынапример, новый двойной [100000]).Вероятно, самый простой подход, но он создаст много мусора.
- Предварительно выделите временные массивы и сохраните их как конечные поля в объекте алгоритма - большой недостаток будет в том, что это будеттолько один поток может запускать алгоритм в любой момент времени.
- Храните предварительно выделенные временные массивы в хранилище ThreadLocal, чтобы поток мог использовать фиксированный объем пространства временного массива всякий раз, когда это необходимо.ThreadLocal потребуется, так как несколько потоков будут запускать один и тот же алгоритм одновременно.
- Передавать множество массивов в качестве параметров (включая временные массивы для используемого алгоритма).Не очень хорошо, так как это сделает API алгоритма крайне уродливым, если вызывающая сторона должна отвечать за предоставление временного пространства массива ....
- Выделить очень большие массивы (например, double [10000000]), но также предоставить алгоритмусмещает в массив, так что разные потоки будут использовать разные области массива независимо.Очевидно, потребуется некоторый код для управления смещениями и распределением диапазонов массивов.
Есть мысли о том, какой подход будет наилучшим (и почему)?