提高速度的一种方法是利用Array.Copy
. 它能够在较低级别上工作,在该级别上批量分配更大的内存部分。
通过批处理分配,您最终可以将数组从一个部分复制到其自身。
最重要的是,批次本身可以非常有效地并行化。
这是我的初始代码。在我的机器(只有两个内核)上,样本数组大小为 1000 万个项目,我得到了 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;
}