gpt4 book ai didi

c# - 将较小的 n 维数组放入较大数组的最快方法(二维图形类比 : paint rectangle on canvas)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:03 28 4
gpt4 key购买 nike

假设我有这个 10x5 数组:

..........
..........
..........
..........
..........

和这个 1x2 数组:

AB
CD
EF

现在我想将第二个数组写入位置 1/2 (X-pos/Y-pos) 的较大数组,删除所有旧值(我的示例是基于零且包含零的)。结果将是:

..........
..........
.AB.......
.CD.......
.EF.......

可能有多个具有已知覆盖层次结构的子数组,数组可能有超过 3 个维度,并且数组包含复杂对象。

是否有在 C# 中执行此操作的最佳实践?
是否有与语言无关的解决方案?

最佳答案

好的,Buffer.BlockCopy 比逐字节复制数据要快得多,即使在消除边界检查之后也是如此。有趣的是,Buffer.BlockCopy 似乎确实适用于二维数组 :)

所以你可能想尝试这样的事情:

byte[,] source = new byte[1000, 100];
byte[,] dest = new byte[2048, 2048];

int offsetX = 100;
int offsetY = 20;

int width = source.GetLength(0);
int height = source.GetLength(1);

for (int y = 0; y < height; y++)
{
Buffer.BlockCopy
(
source, y * height,
dest, offsetX + dest.GetLength(1) * (y + offsetY),
width
);
}

基本上,假设该数组是一个字节数组,其中 X 作为第一个索引,Y 作为第二个索引,我一次一行,一次将整行从 source 传送到 dest。

这似乎比一次简单地复制一个字节要快得多,所以我假设它确实使用 DMA 而不是使用 CPU 来复制字节。

请注意,只有当行足够长时,这才会更快。如果您正在复制单个列,它可能比逐字节复制慢。如果您发现自己复制列比行更频繁(即 width 通常小于 height),您可能需要考虑反转坐标,即。交换 X 和 Y。

关于c# - 将较小的 n 维数组放入较大数组的最快方法(二维图形类比 : paint rectangle on canvas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21829414/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com