我需要从一个缓冲区中读取数据并复制到一个大的保存数组中,以便在下一个中断到达之前完成。使用循环进行复制不是一个选项,速度太慢了。在所有复制完成之前,我不需要组合数据的多维结构,这意味着我可以使用Buffer.BlockCopy()将数据复制到单维数组中,然后再次复制到多维数组中以获取所需的结构。以下是一些代码(在控制台中运行),展示了这种技术以及其性能。
static class Program
{
[STAThread]
static void Main()
{
Stopwatch watch = new Stopwatch();
const int width = 2;
const int depth = 10 * 1000000;
Random r = new Random(100);
int[,] data = new int[width, depth];
for(int i = 0; i < width; i++)
{
for(int j = 0; j < depth; j++)
{
data[i, j] = r.Next();
}
}
watch.Start();
int[] buffer = new int[width * depth];
Buffer.BlockCopy(data, 0, buffer, 0, data.Length * sizeof(int));
watch.Stop();
Console.WriteLine("BlockCopy to flat array took {0}", watch.ElapsedMilliseconds);
int[,] data2 = new int[width, depth];
watch.Start();
Buffer.BlockCopy(buffer, 0, data2, 0,buffer.Length * sizeof(int));
watch.Stop();
Console.WriteLine("BlockCopy to 2 dimensional array took {0}", watch.ElapsedMilliseconds);
data2 = new int[width, depth];
watch.Start();
for (int i = 0; i < width; i++)
{
for (int j = 0; j < depth; j++)
{
data2[i, j] = data[i, j];
}
}
watch.Stop();
Console.WriteLine("Loop-copy to 2 dimensional array took {0} ms", watch.ElapsedMilliseconds);
}
}
输出:
BlockCopy to flat array took 14 ms
BlockCopy to 2 dimensional array took 28 ms
Loop-copy to 2 dimensional array took 149 ms
Array.Copy
旨在快速复制,这意味着利用线性连续内存块复制的事实非常快。你要求以非线性连续的方式进行复制。Array.Copy
并不适合这项工作。你必须找到其他可以为你完成这项工作的东西。特别是,你已经编写的代码完全符合你的要求。使用它。 - jasonArray.Copy
不要求源数组和目标数组在每个维度上的长度相同,但它要求两者具有相同的秩(维数)。Buffer.BlockCopy
没有这个限制。 - rwong