可以提高速度的一種方法是利用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;
}
你正在給你的數組的所有字段設置「值」? – cheesemacfly
是的,他將每個元素設置爲一個非默認的int值 - 這可能是除了微型優化之外最快的方法(某人毫無疑問會顯示一些微型優化技術) –
無論你如何操作,初始化非數組C#中的默認值是O(N)操作。 – Maciej