速度を向上させる1つの方法は、を利用することArray.Copy
です。それは、メモリのより大きなセクションを一括して割り当てる、より低いレベルで機能することができます。
割り当てをバッチ処理することで、配列を1つのセクションからそれ自体にコピーすることができます。
その上、バッチ自体を非常に効果的に並列化できます。
これが私の最初のコードです。サイズが1,000万アイテムのサンプル配列を備えた私のマシン(コアが2つしかない)では、15%程度のスピードアップが得られました。バッチサイズを試して(効率を維持するためにページサイズの倍数にとどまるようにしてください)、所有しているアイテムのサイズに合わせて調整する必要があります。小さい配列の場合、最初のバッチがいっぱいになることはないため、コードとほぼ同じになりますが、そのような場合でも(著しく)悪化することはありません。
private const int batchSize = 1048576;
private static int[] GetDefaultSeriesArray2(int size, int value)
{
int[] result = new int[size];
//fill the first batch normally
int end = Math.Min(batchSize, size);
for (int i = 0; i < end; i++)
{
result[i] = value;
}
int numBatches = size / batchSize;
Parallel.For(1, numBatches, batch =>
{
Array.Copy(result, 0, result, batch * batchSize, batchSize);
});
//handle partial leftover batch
for (int i = numBatches * batchSize; i < size; i++)
{
result[i] = value;
}
return result;
}