私のコードでは、多数のタスクを実行しますが、それぞれがデータを一時的に格納するために大量のメモリ配列を必要とします。私は約500のタスクを持っています。各タスクの開始時に、配列にメモリを割り当てます。
double[] tempDoubleArray = new double[M];
M は、タスクによって異なりますが、通常は 2000000 前後の大きな数値です。ここで、複雑な計算を行って配列を埋め、最後に配列を使用してこのタスクの結果を決定します。その後、tempDoubleArray は範囲外になります。
プロファイリングにより、配列を構築するための呼び出しに時間がかかることが明らかになりました。そこで、配列を静的にして再利用することで、配列を再利用することにしました。配列の最小サイズを把握するには、追加のジャグリングが必要であり、すべてのタスクを通過する追加のパスが必要ですが、機能します。現在、プログラムは大幅に高速化されています (すべてのタスクの実行が 80 秒から 22 秒に短縮されました)。
double[] tempDoubleArray = staticDoubleArray;
しかし、なぜこれがうまく機能するのか、私には少しわかりません。元のコードでは、tempDoubleArray が範囲外になると収集できるので、新しい配列を割り当てることはそれほど難しくないはずですよね?
なぜそれが機能するのかを理解することは、同じ効果を達成するための他の方法を理解するのに役立つかもしれず、割り当てがパフォーマンスの問題を引き起こすケースを知りたいからです。