
تتطلب بعض التحسينات هياكل بيانات معقدة وآلاف أسطر التعليمات البرمجية. في حالات أخرى ، تؤدي الزيادة الخطيرة في الإنتاجية إلى تغيير بسيط: في بعض الأحيان تحتاج فقط إلى تعيين الصفر. هذا يشبه
حكاية قديمة
عن قائد يعرف المكان المناسب لضرب بمطرقة ، ثم يدفع الفواتير للعميل: 0.50 دولار لضربة في الصمام و 999.50 دولار لمعرفة مكان الضرب.
قابلت شخصيًا عدة أخطاء في الأداء تم إصلاحها عن طريق إدخال صفر ، وأريد في هذه المقالة مشاركة قصتين.
أهمية القياس

في أيام Xbox الأصلية ، ساعدت في تحسين العديد من الألعاب. في أحدها ، أشار المحلل إلى وظيفة تحويل المصفوفة ، التي استهلكت 7 ٪ من وقت وحدة المعالجة المركزية - وهي أكبر قفزة على الرسم البياني. لذلك أنا بجد للعمل على تحسين هذه الميزة.

يمكن أن نرى أنني لم أكن أول من حاول القيام بذلك. تم بالفعل إعادة كتابة الوظيفة في المجمع. لقد وجدت العديد من التحسينات المحتملة في لغة التجميع وحاولت قياس تأثيرها. هذه خطوة مهمة ، وإلا فإنه من السهل القيام بـ "التحسين" ، والذي لن يغير شيئًا أو حتى يتفاقم الموقف.
ومع ذلك ، كان القياس صعبا. ركضت اللعبة ، ولعبت قليلاً مع التوصيف المتوازي ، ثم درست الملف الشخصي: هل أصبح الكود أسرع. يبدو أنه كان هناك بعض التحسن الطفيف ، لكن كان من المستحيل القول بالتأكيد.
لذلك طبقت المنهج
العلمي . قام بكتابة مجموعة من الاختبارات لإدارة الإصدارات القديمة والجديدة من التعليمات البرمجية لقياس الاختلافات في الأداء بدقة.

هذا لم يستغرق الكثير من الوقت: كما هو متوقع ، كان الرمز الجديد حوالي 10 ٪ أسرع من القديم.
ولكن اتضح أن تسارع 10 ٪ هو هراء.
هو أكثر إثارة للاهتمام أنه تم تنفيذ داخل رمز الاختبار حوالي 10 مرات أسرع مما كانت عليه في اللعبة. كان هذا اكتشافًا مثيرًا.
بعد التحقق من النتائج ، نظرت إلى الفراغ لفترة من الوقت ، ولكن بعد ذلك اتضح لي.
دور التخزين المؤقت
لمنح مطوري اللعبة التحكم الكامل والأداء الأقصى ، تسمح لك وحدات التحكم في اللعبة بتخصيص الذاكرة بسمات متنوعة. على وجه الخصوص ، يسمح لك Xbox الأصلي بتخصيص ذاكرة غير قابلة للتخزين المؤقت. يعد هذا النوع من الذاكرة (في الواقع ، نوع العلامة في جداول الصفحات) مفيدًا عند كتابة البيانات إلى وحدة معالجة الرسومات. نظرًا لأن الذاكرة غير مخزنة مؤقتًا ، فستنتقل الكتابة إلى ذاكرة الوصول العشوائي على الفور تقريبًا دون أي تأخير أو تلوث في ذاكرة التخزين المؤقت مع تعيين "طبيعي".
وبالتالي ، تعتبر الذاكرة غير المخزنة مؤقتًا تحسينًا مهمًا ، ولكن يجب استخدامها بعناية. على وجه الخصوص ، من المهم للغاية ألا تحاول الألعاب أبدًا
القراءة من الذاكرة غير المخزنة مؤقتًا ، وإلا فإن أداءها سينخفض بشدة. حتى
وحدة المعالجة المركزية البطيئة نسبياً والتي تبلغ
733 ميجاهرتز في أجهزة Xbox الأصلية تحتاج إلى مخابئها الخاصة لتوفير أداء قراءة كاف.
الآن يصبح من الواضح ما يحدث. على ما يبدو ، بالنسبة لهذه الوظيفة ، يتم تخصيص البيانات في الذاكرة غير المخزنة مؤقتًا ، وبالتالي الأداء المنخفض. أكد اختبار صغير هذه الفرضية ، لذلك حان الوقت لإصلاح المشكلة. لقد وجدت السطر الذي تم تخصيص الذاكرة فيه ، وانقر نقرًا مزدوجًا فوق قيمة العلامة ، وأشر إلى الصفر.
بدلاً من حوالي 7٪ من وقت المعالج ، بدأت الوظيفة تستهلك حوالي 0.7٪ ولم تعد مشكلة.
في نهاية الأسبوع ، بدا تقريري مثل هذا: "39،999 ساعة من البحث ، 0.001 ساعة من البرمجة هي نجاح كبير!"
لا يحتاج المطورون عادة إلى القلق بشأن تخصيص ذاكرة غير مخزنة مؤقتًا بطريق الخطأ: في معظم أنظمة التشغيل ، لا يتوفر هذا الخيار في مساحة المستخدم باستخدام الطرق القياسية. ولكن إذا كنت مهتمًا بكمية الذاكرة المخزنة مؤقتًا التي يمكنها إبطاء البرنامج ، فجرب إشارات PAGE_NOCACHE أو PAGE_WRITECOMBINE في
VirtualAlloc .
0 غيغابايت أفضل من 4 غيغابايت

اريد ان اخبرك قصة اخرى فهو يقع في حوالي خلل وجدت ، وشخص آخر إصلاحه. قبل عامين ، لاحظت أن ذاكرة التخزين المؤقت على القرص على جهاز الكمبيوتر المحمول غالبًا ما يتم مسحها. تتبعت أن هذا يحدث عند الوصول إلى خط 4 جيجا بايت ، وفي النهاية اتضح أن برنامج التشغيل الخاص بي HDD النسخ الاحتياطي الجديد يعين SectorSize إلى 0xFFFFFFFF (أو −1) عند الإشارة إلى حجم قطاع غير معروف. يفسر Windows kernel هذه القيمة كـ 4 غيغابايت ويخصص كتلة الذاكرة المقابلة ، والتي تسببت في المشكلة.
ليس لدي جهات اتصال في Western Digital ، لكن يمكنني أن أفترض أنهم قاموا بإصلاح هذا الخطأ عن طريق استبدال ثابت 0xFFFFFFFF (أو −1) بصفر. تم إدخال حرف واحد - وحل مشكلة أداء خطيرة.
(اقرأ المزيد عن هذه الدراسة في مقال "إبطاء ويندوز: استكشاف وتحديد الهوية" )الملاحظات
- في كلتا الحالتين ، فإن المشكلة تكمن في التخزين المؤقت
- كان حاسما استخدام التعريف من أجل تحديد المشكلة.
- إذا لم يتم التحقق من التصحيح بواسطة القياسات ، فلن يساعد ذلك بالضرورة.
- يمكنني الكتابة عن العديد من الحالات الأخرى ، لكنها إما سرية للغاية أو مملة للغاية.
- القرار الصحيح لا يجب أن يكون معقدًا. في بعض الأحيان تحسن كبير يعطي تغيير طفيف. كل ما تحتاج إلى معرفته هو أين
لقد حدث تحسين في التعليمة البرمجية عن طريق uncommenting #define وتغييرات تافهة أخرى. أخبرنا في التعليقات إذا كان لديك مثل هذه القصص.