В моем коде я выполняю большое количество задач, каждая из которых требует большого массива памяти для временного хранения данных. У меня около 500 заданий. В начале каждой задачи я выделяю память для
массив:
double[] tempDoubleArray = new double[M];
M - большое число, зависящее от конкретной задачи, обычно около 2000000. Теперь я делаю несколько сложных вычислений, чтобы заполнить массив, и в конце я использую массив, чтобы определить результат этой задачи. После этого tempDoubleArray выходит из области видимости.
Профилирование показывает, что вызовы для создания массивов занимают много времени. Итак, я решил попробовать и повторно использовать массив, сделав его статическим и используя его повторно. Это требует дополнительного жонглирования
выяснить минимальный размер массива, требующий дополнительного прохождения всех задач, но он работает. Теперь программа стала намного быстрее (от 80 секунд до 22 секунд для выполнения всех задач).
double[] tempDoubleArray = staticDoubleArray;
Однако я немного не в курсе, почему именно это так хорошо работает. Я бы сказал, что в исходном коде, когда tempDoubleArray выходит из области видимости, его можно собирать, поэтому выделение нового массива не должно быть таким сложным, верно?
Я спрашиваю об этом, потому что понимание того, почему это работает, может помочь мне найти другие способы достижения того же эффекта, и потому что я хотел бы знать, в каких случаях распределение приводит к проблемам с производительностью.