.NET +大量のメモリトリックのコピー


4

昔、ある場所から別の場所に大量のメモリをコピーするために、(多くの場合オフスクリーンフレームバッファをブリッジするために)使用されたトリックがありました。

私はC#で作業しているので、1つのメモリ位置から別の1秒間に約60回のバイト配列(約32kのサイズ)を移動する必要があることがわかりました。

どういうわけか、ここでforループのバイト単位のコピーは最適ではないと思います。

純粋に管理されたコードにとどまっているうちに、このような作業をするのは誰もが知っていますか?

もしそうでなければ、私はP/Invokingをやりたいですか、安全でないモードに入っていますが、私はクロスプラットフォームの理由から管理できるようにしたいと思います。

EDIT: 私はちょうど楽しみのために書いたいくつかのベンチマークコード: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 9月. 082008-09-24 01:13:33

  0

はい、Nowを使用したタイミングは、ここよりも多くの繰り返しを行わない限り、使用された合計時間を取得するために、むしろ無駄です。 Now()はほとんどのシステムで毎秒64分の1秒ごとにしかチェックを行わないので、ベンチマークが成立すると、最初の2つは> 8ミリ秒、最後は<8ミリ秒です。 24 9月. 082008-09-24 01:24:15

8

私はあなたがBuffer.BlockCopy( )正しいことを助けることができる

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