質問

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

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

どういうわけか、ここでは for ループでバイトごとにコピーするのが最適とは思えません。

純粋にマネージド コードのままでこの種の作業を実行するための良いトリックを知っている人はいますか?

そうでない場合は、P/Invoking を実行するか、安全でないモードに移行するつもりですが、クロスプラットフォームの理由から、できれば管理された状態を維持したいと考えています。

編集:楽しみのために書いたいくつかのベンチマーク コード:

バイトごと: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