我试图将一个锯齿状数组复制到另一个具有给定偏移量的锯齿状数组中。我想出了以下内容:
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){}
}
}
不幸的是它很慢。有没有办法更快地完成它?
答案 0 :(得分:0)
如this comment中所述,异常处理非常昂贵,如果您在代码中将其用作普通的控制流机制,则会使代码非常变慢。< / p>
您可以通过编写代码轻松避免异常,这样它就不会首先使用超出范围的索引值:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="app/singUpController.js"></script>
<script src="app/productDetailController.js"></script>
<script src="app/controller.js"></script>
<div class="hover-div" ng-app="shoppingApp" ng-right-click>
<img id="myImage" class="imageSet" src="https://dummyimage.com/300.png/09f/fff" alt="altImg" width="300" height="300" scale="0" ng-click="currentImage($index)"/>
</div>
答案 1 :(得分:0)
正如@Steve所建议的那样,避免退出索引并迭代数组的必要部分而不是迭代整个数组的费用。
将它与Parallel.For和Array.Copy结合使用(它应该使用SIMD扩展名more info here),并且几乎有一个照明快速数组复制功能。
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);
});
}