.NET + 많은 양의 메모리 트릭 복사


4

예전에는 많은 양의 메모리를 한 위치에서 다른 위치로 복사하는 데 트릭이 사용되었습니다 (종종 화면 외부 프레임 버퍼를 블리 팅하는 데 사용).

C#에서 작업 중이므로 한 메모리 위치에서 초당 약 60 회 바이트 배열 (대략 32k 크기)을 다른 위치로 옮길 필요가 있음을 발견했습니다.

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

순전히 관리되는 코드에 머무르면서이 작업을 수행하는 좋은 방법을 아는 사람이 있습니까?

그렇지 않은 경우 일부 P/Invoking를 수행하거나 안전하지 않은 모드로 들어가기를 원하지만 교차 플랫폼 이유로 할 수 있으면 관리를 유지하고 싶습니다.

편집 : 난 그냥 재미를 위해 쓴 일부 벤치마킹 코드 : 15.6192

블록 복사 : 0

루프 당 15.6192

4 바이트 : 바이트

바이트

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); 
+1

System.Diagnostics.Stopwatch, 도움이 될 수 있습니다 아주 멋진 수업을 할 수 있습니다. 24 sep. 082008-09-24 01:13:33

  0

예, 여기를 사용하는 것보다 훨씬 반복하지 않는 한 Now를 사용하는 타이밍은 오히려 쓸모가 없으므로 사용 된 총 시간이 길어집니다. Now()는 대부분의 시스템에서 초당 64 분의 1 초만 틱하므로 모든 벤치 마크 설정은 처음 두 시간이> 8 ms이고 마지막 시간이 <8 ms입니다. 24 sep. 082008-09-24 01:24:15

8

저는 여러분이 Buffer.BlockCopy () 옳은 일을

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