استدعاءات أسلوب قياس الأداء في C# [نسخة مكررة]

StackOverflow https://stackoverflow.com/questions/1622440

  •  06-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أنا أبحث عن طريقة لقياس استدعاءات الطريقة في C#.

لقد قمت بترميز بنية بيانات للمهمة الجامعية، وتوصلت للتو إلى طريقة لتحسينها قليلاً، ولكن بطريقة من شأنها أن تضيف القليل من الحمل في جميع المواقف، أثناء تحويل استدعاء O(n) إلى O(1) في بعض.

أريد الآن تشغيل كلا الإصدارين مقابل بيانات الاختبار لمعرفة ما إذا كان الأمر يستحق تنفيذ التحسين.أعلم أنه في Ruby، يمكنك لف الكود في كتلة Benchmark وجعله يخرج الوقت اللازم لتنفيذ الكتلة في وحدة التحكم - هل هناك شيء من هذا القبيل متاح لـ C#؟

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

المحلول

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

نصائح أخرى

مسروقة (وتعديلها) من إجابة يوري:

private static void Benchmark(Action act, int iterations)
{
    GC.Collect();
    act.Invoke(); // run once outside of loop to avoid initialization costs
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        act.Invoke();
    }
    sw.Stop();
    Console.WriteLine((sw.ElapsedMilliseconds / iterations).ToString());
}

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

لقد سرقت معظم ما يلي من طريقة جون سكيت لقياس الأداء:

private static void Benchmark(Action act, int interval)
{
    GC.Collect();
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < interval; i++)
    {
        act.Invoke();
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

إليك بعض الأشياء التي وجدتها عن طريق التجربة والأخطاء.

  1. تجاهل الدفعة الأولى من (الآلاف) التكرارات.من المرجح أن يتأثروا بـ JITter.
  2. تشغيل المعيار على منفصل Thread الكائن يمكن أن يعطي نتائج أفضل وأكثر استقرارا.أنا لا أعرف لماذا.
  3. لقد رأيت بعض الناس يستخدمون Thread.Sleep لأي سبب من الأسباب قبل تنفيذ المعيار.وهذا لن يؤدي إلا إلى تفاقم الأمور.أنا لا أعرف لماذا.ربما بسبب JITter.
  4. لا تقم مطلقًا بتشغيل المعيار مع تمكين تصحيح الأخطاء.من المرجح أن يتم تشغيل الكود بأوامر ذات حجم أبطأ.
  5. قم بتجميع التطبيق الخاص بك مع تمكين كافة التحسينات.يمكن أن تتأثر بعض التعليمات البرمجية بشكل كبير بالتحسين، بينما لن تتأثر التعليمات البرمجية الأخرى، لذا فإن التجميع بدون تحسين سيؤثر على موثوقية معيارك.
  6. عند التجميع مع تمكين التحسينات، يكون من الضروري في بعض الأحيان تقييم مخرجات المعيار بطريقة أو بأخرى (على سبيل المثال.طباعة قيمة، الخ).وإلا فإن المترجم قد "يكتشف" أن بعض الحسابات عديمة الفائدة ولن يؤديها ببساطة.
  7. يمكن أن يكون لاستدعاء المندوبين عبء ملحوظ عند تنفيذ معايير معينة.من الأفضل وضع أكثر من تكرار واحد داخل المفوض، بحيث يكون للحمل تأثير ضئيل على نتيجة المعيار.
  8. يمكن أن يكون لمحللي الملفات النفقات العامة الخاصة بهم.إنهم جيدون في إخبارك بأجزاء التعليمات البرمجية الخاصة بك التي تمثل اختناقات، لكنهم ليسوا جيدين في قياس شيئين مختلفين بشكل موثوق.
  9. بشكل عام، يمكن أن يكون لحلول قياس الأداء الرائعة نفقات عامة ملحوظة.على سبيل المثال، إذا كنت تريد قياس العديد من الكائنات باستخدام واجهة واحدة، فقد يكون من المغري تضمين كل كائن في الفصل الدراسي.ومع ذلك، تذكر أن مُنشئ الفصل لديه أيضًا نفقات إضافية يجب أخذها في الاعتبار.من الأفضل إبقاء كل شيء بسيطًا ومباشرًا قدر الإمكان.

يبدو أنك تريد أ ملف التعريف.سأوصي بشدة ملف تعريف EQATEC بنفسي، إنه أفضل تطبيق مجاني قمت بتجربته.الشيء الجميل في هذه الطريقة مقارنة بساعة توقيت بسيطة هو أنها توفر أيضًا تحليلاً للأداء عبر طرق/كتل معينة.

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

لتحسين الخوارزمية، عندما تعرف مكان الاختناقات، استخدم قاموس الاسم-->ساعة الإيقاف، لتتبع الأقسام الهامة للأداء أثناء وقت التشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top