سؤال

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

لقد جعلني أتساءل، كيف يمكنك تحقيق سرعة تنفيذ التعليمات البرمجية الخاصة بك؟هل هناك أي مرافق (مجانية)؟هل تفعل ذلك بالطريقة القديمة باستخدام System.Timer وتفعل ذلك بنفسك؟

هل كانت مفيدة؟

المحلول

ما تصفه يُعرف باسم ملف تعريف الأداء.هناك العديد من البرامج التي يمكنك الحصول عليها للقيام بذلك مثل ملف تعريف Jetbrains أو ملف تعريف النمل, ، على الرغم من أن معظمها سيؤدي إلى إبطاء تطبيقك أثناء عملية قياس أدائه.

لتجميع ملف تعريف الأداء الخاص بك يدويًا، يمكنك استخدام System.Diagnostics.Stopwatch وConsole.WriteLine بسيط، كما وصفته.

ضع في اعتبارك أيضًا أن برنامج التحويل البرمجي C# JIT يقوم بتحسين التعليمات البرمجية اعتمادًا على النوع والتكرار الذي يطلق عليه، لذا يمكنك تجربة الحلقات ذات الأحجام والأساليب المختلفة مثل الاستدعاءات المتكررة للتعرف على ما يعمل بشكل أفضل.

نصائح أخرى

ملف التعريف ANTS من RedGate هو ملف تعريف أداء لطيف حقًا. ملف تعريف dotTrace من JetBrains هو أيضا عظيم.ستسمح لك هذه الأدوات برؤية مقاييس الأداء التي يمكن التعمق فيها في كل سطر على حدة.

لقطة شاشة لملف التعريف ANTS:النمل http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

إذا كنت تريد التأكد من بقاء طريقة معينة ضمن حد أداء محدد أثناء اختبار الوحدة، فسأستخدم Stopwatch فصل لمراقبة وقت تنفيذ إحدى الطرق عدة مرات في الحلقة وحساب المتوسط ​​ثم Assert ضد النتيجة.

مجرد تذكير - تأكد من التجميع في Relase، وليس Debug!(لقد رأيت هذا الخطأ الذي ارتكبه مطورون متمرسون، ومن السهل نسيانه).

ما تصفه هو "ضبط الأداء".عندما نتحدث عن ضبط الأداء هناك زاويتان لذلك.(أ) وقت الاستجابة - المدة التي يستغرقها تنفيذ طلب/برنامج معين.(ب) الإنتاجية - عدد الطلبات التي يمكن تنفيذها في الثانية.عندما نقوم عادةً "بالتحسين" - عندما نتخلص من المعالجة غير الضرورية، يتحسن كل من وقت الاستجابة والإنتاجية.ومع ذلك، إذا كان لديك أحداث انتظار في التعليمات البرمجية الخاصة بك (مثل Thread.sleep()، وانتظار الإدخال/الإخراج وما إلى ذلك)، فسيتأثر وقت الاستجابة ولكن لا يتأثر معدل النقل.من خلال اعتماد المعالجة المتوازية (توليد خيوط متعددة) يمكننا تحسين وقت الاستجابة ولكن لن يتم تحسين الإنتاجية.عادةً ما يكون وقت الاستجابة والإنتاجية مهمًا للتطبيق من جانب الخادم.بالنسبة لتطبيقات سطح المكتب (مثل IDE)، فإن الإنتاجية ليست مهمة، بل إن وقت الاستجابة هو المهم.

يمكنك قياس وقت الاستجابة من خلال "اختبار الأداء" - ما عليك سوى تدوين وقت الاستجابة لجميع المعاملات الرئيسية.يمكنك قياس الإنتاجية عن طريق "اختبار التحميل" - تحتاج إلى ضخ الطلبات بشكل مستمر من عدد كبير بما فيه الكفاية من الخيوط/العملاء بحيث يكون استخدام وحدة المعالجة المركزية لجهاز الخادم 80-90%.عندما نقوم بضخ الطلب، نحتاج إلى الحفاظ على النسبة بين المعاملات المختلفة (وتسمى مزيج المعاملات) - على سبيل المثال:في نظام الحجز سيكون هناك 10 حجز لكل 100 بحث.سيكون هناك إلغاء واحد لكل 10 حجز وما إلى ذلك.

بعد تحديد المعاملات التي تتطلب ضبط وقت الاستجابة (اختبار الأداء)، يمكنك تحديد النقاط الساخنة باستخدام ملف التعريف.يمكنك تحديد النقاط الساخنة للإنتاجية من خلال مقارنة وقت الاستجابة * جزء من تلك المعاملة.لنفترض في سيناريو البحث والحجز والإلغاء أن النسبة هي 89:10:1.زمن الاستجابة هو 0.1 ثانية و10 ثانية و15 ثانية.التحميل للبحث - 0.1 * .89 = 0.089 تحميل للحجز - 10 * .1 = 1 تحميل للإلغاء = 15 * .01 = 0.15 هنا سيؤدي الحجز إلى أقصى تأثير على الإنتاجية.يمكنك أيضًا تحديد النقاط الفعالة للإنتاجية عن طريق أخذ عمليات تفريغ الخيوط (في حالة التطبيقات المستندة إلى Java) بشكل متكرر.

استخدم ملف التعريف.

إذا كنت بحاجة إلى تحديد الوقت بطريقة محددة فقط، فقد تكون فئة Stopwatch خيارًا جيدًا.

أقوم بالأمور التالية:1) أستخدم علامات التجزئة (على سبيل المثالفي VB.Net Now.ticks) لقياس الوقت الحالي.أقوم بطرح علامات البداية من قيمة علامات التجزئة النهائية وتقسيمها على TimeSpan.TicksPerSecond للحصول على عدد الثواني المستغرقة.2) أتجنب عمليات واجهة المستخدم (مثل console.writeline).3) أقوم بتشغيل الكود عبر حلقة كبيرة (مثل 100000 تكرار) لتحليل متغيرات الاستخدام/نظام التشغيل بأفضل ما أستطيع.

يمكنك استخدام فئة StopWatch لأساليب الوقت.تذكر أن المرة الأولى غالبًا ما تكون بطيئة بسبب الحاجة إلى تحريك التعليمات البرمجية.

يوجد خيار .NET أصلي (إصدار الفريق لمطوري البرامج) والذي قد يلبي بعض احتياجات تحليل الأداء.من قائمة .NET IDE لعام 2005، حدد أدوات->أدوات الأداء->معالج الأداء...

[ربما يكون GSS على حق في أنه يجب أن يكون لديك إصدار الفريق]

هذا مثال بسيط لاختبار سرعة الكود.أرجو أن أكون ساعدك

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top