سؤال

في الأيام الخوالي، كانت هناك حيل مستخدمة (غالبًا لمسح المخزن المؤقت للإطارات خارج الشاشة)، لنسخ أجزاء كبيرة من الذاكرة من موقع إلى آخر.

الآن بعد أن أعمل في C#، وجدت الحاجة إلى نقل مجموعة من البايتات (حجمها حوالي 32 كيلو بايت) من موقع ذاكرة إلى آخر حوالي 60 مرة في الثانية.

بطريقة ما، لا أعتقد أن النسخ بالبايت في حلقة for هو الأمثل هنا.

هل يعرف أحد خدعة جيدة للقيام بهذا النوع من العمل مع الاستمرار في البقاء في التعليمات البرمجية المُدارة بحتة؟

إذا لم يكن الأمر كذلك، فأنا على استعداد لإجراء بعض عمليات P/Invocing أو الانتقال إلى الوضع غير الآمن، ولكنني أرغب في البقاء مُدارًا إذا استطعت لأسباب تتعلق بالأنظمة الأساسية.

يحرر:بعض أكواد القياس التي كتبتها للمتعة فقط:

بايت تلو بايت: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