2 回答
TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以在命名空間中使用向量System.Numerics。需要注意的是,它只適用于float,而不適用于double。不過,這不應(yīng)該是減法的問題:
float[] array1 = new float[] { 1.1F, 2.0F, 3.0F, 4.0F, 5.0F };
float[] array2 = new float[] { 6.1F, 7.0F, 8.0F };
float[,] final_array = new float[array1.Length, array2.Length];
int vectorCount = array2.Length / 4;
Vector4[] array2Vectors = new Vector4[vectorCount];
Parallel.For(0, vectorCount, i =>
{
int offset = i * 4;
array2Vectors[i] = new Vector4(array2[offset], array2[offset + 1],
array2[offset + 2], array2[offset + 3]);
});
Parallel.For(0, array1.Length, i =>
{
Vector4 v1 = new Vector4(array1[i], array1[i], array1[i], array1[i]);
for (int j = 0; j < array2Vectors.Length; j++)
{
Vector4 result = Vector4.Abs(Vector4.Subtract(v1, array2Vectors[j]));
int offset = j * 4;
final_array[i, offset] = result.X;
final_array[i, offset + 1] = result.Y;
final_array[i, offset + 2] = result.Z;
final_array[i, offset + 3] = result.W;
}
for (int j = vectorCount * 4; j < array2.Length; j++)
{
final_array[i,j] = Math.Abs(array1[i] - array2[j]);
}
});
由于您現(xiàn)在使用向量,因此您將使用 CPU 的 SIMD 指令,這將加快您的任務(wù)。
額外的性能提升來自Parallel.For使用所有可用 CPU 內(nèi)核的并行執(zhí)行。
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
就算法復(fù)雜性而言,沒有辦法更快地做到這一點(diǎn)。它需要精確O(n * m)的操作來計(jì)算這個(gè)結(jié)果,至少因?yàn)槟阌心莻€(gè)大小的結(jié)果數(shù)組。
有一些方法可以稍微提高代碼本身的性能。
正如評(píng)論中已經(jīng)建議的那樣,最簡(jiǎn)單的一種是切換到鋸齒狀數(shù)組:
double[] array1 = new double [] { 1.1, 2.0, 3.0, 4.0, 5.0 };
double[] array2 = new double[] { 6.1, 7.0, 8.0};
double[][] final_array = new double[5][];
for (int i = 0; i < 5; i++)
{
final_array[i] = new double[3];
for (int j = 0; j < 3; j++)
{
final_array[i][j] = Math.Abs(array1[i] - array2[j]);
}
}
您可以在此處閱讀有關(guān)多維數(shù)組與交錯(cuò)數(shù)組及其性能的更多信息:
C# 中多維數(shù)組和數(shù)組數(shù)組之間的區(qū)別是什么?
您還可以通過使用不安全指針訪問多維數(shù)組或利用高級(jí)處理器指令(內(nèi)在函數(shù))進(jìn)一步提高性能,但是......問題是:這真的是您需要考慮的事情嗎?它是極高負(fù)載系統(tǒng)中唯一的瓶頸嗎?如果不是,那么只需將您的代碼保持原樣,以清晰易讀和易于理解的形式。說到性能,O(n * m)漸近復(fù)雜度對(duì)于大小為 15000 的數(shù)組來說非常好。
- 2 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報(bào)
