[英]Jagged array, copy with offset
我正在嘗試將一個鋸齒狀數組復制到具有給定偏移量的另一個鋸齒狀數組中。 我想出了以下幾點:
private void CopyWithOffset(char[][] buffer, (int row, int col) offset)
{
if (buffer == null) throw new ArgumentNullException(nameof(buffer));
for (var row = 0; row < buffer.Length; row++)
{
try
{
for (var col = 0; col < buffer[row].Length; col++)
{
try
{
_buffer[row + offset.row][col + offset.col] = buffer[row][col];
}
catch (IndexOutOfRangeException){}
}
} catch(IndexOutOfRangeException){}
}
}
不幸的是,它非常慢。 有什么辦法可以更快地做到這一點?
如本注釋中所述 ,異常處理非常昂貴,如果將其用作代碼中的常規控制流機制,它將使該代碼非常慢。
您只需編寫代碼就可以輕松避免異常,這樣一來,它就不會使用超出范圍的索引值:
private void CopyWithOffset(char[][] buffer, (int row, int col) offset)
{
if (buffer == null) throw new ArgumentNullException(nameof(buffer));
for (var row = 0; row < buffer.Length; row++)
{
for (var col = 0; col < buffer[row].Length ; col++)
{
int i = row + offset.row;
if (i < _buffer.Length)
{
int j = col + offset.col;
if (j < _buffer[i].Length)
{
_buffer[i][j] = buffer[row][col];
}
}
}
}
}
正如@Steve所建議的那樣,避免超出索引並遍歷數組的必要部分,而不是遍歷整個數組需要付出巨大的代價。
將其與Parallel.For和Array.Copy結合使用(應該在此處使用SIMD擴展名更多信息 ),其中的一個具有照明快速數組復制功能。
public static void CopyWithOffset(char[][] buffer, int x, int y)
{
var rowStart = Math.Max(Math.Min(y, _buffer.Length), 0);
var rowLenght = _buffer.Length + Math.Min(y, 0);
Parallel.For(rowStart, rowLenght, row =>
{
var colStart = Math.Max(Math.Min(x, _buffer[row].Length), 0);
var colLength = _buffer[row].Length + Math.Min(x, -1);
Array.Copy(buffer[row - y], colStart - x, _buffer[row], colStart, colLength);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.