C# .NET+;复制大量内存技巧

C# .NET+;复制大量内存技巧,c#,.net,memory-management,C#,.net,Memory Management,回到过去,人们使用了一些技巧(通常是在屏幕外的帧缓冲区中使用的),将大块内存从一个位置复制到另一个位置 现在我正在使用C#,我发现需要将字节数组(大约32k大小)从一个内存位置移动到另一个内存位置,大约每秒移动60次 不知何故,我不认为for循环中的逐字节复制是最佳的 有没有人知道一个好方法,可以在保持纯托管代码的同时完成这类工作 如果没有,我愿意进行一些p/调用或进入不安全模式,但出于跨平台原因,如果可以,我希望保持管理 编辑: 我编写的一些基准测试代码只是为了好玩: 逐字节:15.6192

回到过去,人们使用了一些技巧(通常是在屏幕外的帧缓冲区中使用的),将大块内存从一个位置复制到另一个位置

现在我正在使用C#,我发现需要将字节数组(大约32k大小)从一个内存位置移动到另一个内存位置,大约每秒移动60次

不知何故,我不认为for循环中的逐字节复制是最佳的

有没有人知道一个好方法,可以在保持纯托管代码的同时完成这类工作

如果没有,我愿意进行一些p/调用或进入不安全模式,但出于跨平台原因,如果可以,我希望保持管理

编辑: 我编写的一些基准测试代码只是为了好玩:

逐字节:15.6192

每个循环4个字节:15.6192

阻止复制:0

Byte[]src=新字节[65535];
字节[]dest=新字节[65535];
日期时间开始时间,结束时间;
startTime=DateTime.Now;
对于(int k=0;k<60;k++)
{
对于(int i=0;i钢筋混凝土长度)
{
//一次复制一个剩余字节。
而(i
我认为你可以依靠Buffer.BlockCopy()来做正确的事情


System.Diagnostics.Stopwatch,非常酷的课程,可以提供帮助。是的,现在使用计时是毫无用处的,除非你重复的次数比这里多得多,以提高总使用时间。在大多数系统上,Now()仅每隔64秒滴答一次,因此您的基准测试所确定的是前两个大于8毫秒,最后一个小于8毫秒。
Byte[] src = new byte[65535];
            Byte[] dest = new byte[65535];
            DateTime startTime, endTime;

            startTime = DateTime.Now;
            for (int k = 0; k < 60; k++)
            {
                for (int i = 0; i < src.Length; i++)
                {
                    dest[i] = src[i];
                }
            }
            endTime = DateTime.Now;

            Console.WriteLine("Byte by Byte: " + endTime.Subtract(startTime).TotalMilliseconds);

            startTime = DateTime.Now;
            for (int k = 0; k < 60; k++)
            {
                int i = 0;
                while (i < src.Length)
                {
                    if (i + 4 > src.Length)
                    {
                        // Copy the remaining bytes one at a time.
                        while(i < src.Length)
                        {
                            dest[i] = src[i];
                            i++;
                        }
                        break;
                    }
                    
                    dest[i] = src[i];
                    dest[i + 1] = src[i + 1];
                    dest[i + 2] = src[i + 2];
                    dest[i + 3] = src[i + 3];

                    i += 4;                    
                }
            }
            endTime = DateTime.Now;

            Console.WriteLine("4 Bytes per loop: " + endTime.Subtract(startTime).TotalMilliseconds);

            startTime = DateTime.Now;
            for (int k = 0; k < 60; k++)
            {
                Buffer.BlockCopy(src, 0, dest,0, src.Length);
            }
            endTime = DateTime.Now;

            Console.WriteLine("Block Copy: " + endTime.Subtract(startTime).TotalMilliseconds);