문제

옛날에는 한 위치에서 다른 위치로 큰 메모리 덩어리를 복사하기 위해 (종종 블리팅 오프 스크린 프레임 버퍼를 위해) 사용 된 트릭이 사용되었습니다.

이제 C#에서 작업 했으므로 한 메모리 위치에서 초당 약 60 회 이상의 바이트 (대략 32k) 배열을 이동해야 할 필요성을 발견했습니다.

어쨌든, 나는 for 루프의 바이트 사본이 여기서 최적이라고 생각하지 않습니다.

여전히 순수하게 관리되는 코드를 유지하면서 이런 종류의 작업을 수행하는 좋은 트릭을 알고 있습니까?

그렇지 않다면, 나는 p/를 호출하거나 안전하지 않은 모드로 이동하려고하지만 크로스 플랫폼의 이유로 가능하다면 관리를 유지하고 싶습니다.

편집 : 재미를 위해 작성한 일부 벤치마킹 코드 :

바이트 바이트 : 15.6192

루프 당 4 바이트 : 15.6192

블록 카피 : 0

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);
도움이 되었습니까?

해결책

옳은 일을하기 위해 buffer.blockcopy ()를 믿을 수 있다고 생각합니다.

http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top