Frage

Zurück in den alten Tagen gab es Tricks (oft für Off-Screen-Framebuffer Blitten), große Teile des Speichers von einem Ort zum anderen kopieren.

Nun, da ich in C # gerade arbeite, habe ich das Bedürfnis, finde eine Reihe von Bytes (ca. 32k in der Größe) von einem Speicherplatz zu einem anderen etwa 60 Mal pro Sekunde zu bewegen.

Irgendwie glaube ich nicht ein Byte für Byte Kopie in einem for-Schleife ist hier optimal.

Kennt jemand einen guten Trick, um dies irgendwie Arbeit zu tun, während sie noch in rein verwalteten Code zu bleiben?

Wenn nicht, ich bin bereit, etwas zu tun P / oder in unsicheren Modus aufrufen, aber ich möchte es geschafft, bleiben, wenn ich kann für Cross-Plattform-Gründen.

EDIT: Einige Benchmarking Code, den ich schrieb bis nur zum Spaß:

  

Byte für Byte: 15,6192

     

4 Bytes pro Schleife: 15,6192

     

Block Copy: 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);
War es hilfreich?

Lösung

Ich glaube, Sie auf Buffer.BlockCopy zählen können (), um das Richtige zu tun

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top