سؤال

هل من الممكن أن الملفات الفردية الملف الشخصي عبر السمات في .NET؟

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

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

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

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

المحلول

لا يمكنك استخدام السمات لما تفعله. ومع ذلك، لديك بعض الخيارات:

أولا، العديد من أدوات Profiler هناك (مثل redgate النمل) غير مكلفة نسبيا (200 دولار) 300 دولار) وسهلة الاستخدام، وأكثر فترات تقييم مجانية في غضون أسبوعين - حتى تتمكن من معرفة ما إذا كانوا سيعطونك المصعد الذي تحتاجه الآن، قبل أن تقرر ما إذا كنت تريد شرائها. أيضا، .NET CLR Profiler. مجاني لتحميل.

إذا لم يكن ذلك ممكنا، فربما يكون postsharp أسهل طريقة لتنسيق هذا المنطق في التعليمات البرمجية الخاصة بك.

أخيرا، إذا لم تتمكن من استخدام Postsharp لأي سبب من الأسباب وأنت على استعداد للذهاب وإضافة سمات إلى التعليمات البرمجية الخاصة بك، فقد تضاف جيدا كتلة أدوات بسيطة لكل طريقة في شكل كتلة باستخدام:

public void SomeMethodToProfile()
{
    // following line collects information about current executing method
    // and logs it when the metric tracker is disposed of
    using(MetricTracker.Track(MethodBase.GetCurrentMethod()))
    { 
        // original code here...
    }
}

يبدو تنفيذ Metrictracker نموذجي شيء مثل هذا:

public sealed class MetricTracker : IDisposable
{
    private readonly string m_MethodName;
    private readonly Stopwatch m_Stopwatch;

    private MetricTracker( string methodName ) 
       { m_MethodName = methodName; m_Stopwatch = Stopwatch.StartNew(); }

    void IDisposable.Dispose()
       { m_Stopwatch.Stop(); LogToSomewhere(); }

    private void LogToSomewhere()
       { /* supply your own implementation here...*/ }

    public static MetricTracker Track( MethodBase mb )
       { return new MetricTracker( mb.Name ); }
}

نصائح أخرى

يمكنك استخدام postsharp. للقيام ببعض النسيج، تحول أساسا:

[Profiled]
public void Foo()
{
     DoSomeStuff();
}

إلى

public void Foo()
{
    Stopwatch sw = Stopwatch.StartNew();
    try
    {
        DoSomeStuff();
    }
    finally
    {
        sw.Stop();
        ProfileData.AddSample("Foo", sw.Elapsed);
    }
}

في الواقع، النظر في وثائق Postsharp، يجب أن تكون قادرا على استخدامها جبل طارق (مع postsharp) لهذا، إذا كنت تستطيع تحمله. وإلا فإنك قد تنتهي بالإنفاق في اليوم أو نحو ذلك الحصول على تعليق Postsharp، ولكن لا يزال بإمكانه أن يكون يستحق كل هذا العناء.

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

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

أود أن أصفها كمعيار يجتمع اختبار الوحدة. المفهوم هو عزل أقسام التعليمات البرمجية من أجل قياس أو مقارنة السرعة.

من الممثلة النموذجية على استخدام السمة تبدو كما يلي:

[ProfileClass]
public class ForEachLoopBenchmarks
{
    [ProfileMethod]
    public void ForLoopBenchmark()
    {
        List<int> list = GetNumberList();

        for (int i = 0; i < list.Count; i++)
        {
        }
    }

    [ProfileMethod]
    public void ForEachLoopBenchmark()
    {
        List<int> list = GetNumberList();

        foreach (int i in list)
        {
        }
    }

    private List<int> GetNumberList()
    {
        List<int> list = new List<int>();
        for (int i = 0; i < 1000; i++)
        {
            list.Add(i);
        }
        return list;
    }
}

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

class Program
{
    static void Main(string[] args)
    {
        ProfileRunner rp = new ProfileRunner();
        rp.Run();
    }
}

سينظر إخراج وحدة التحكم كما يلي:

console output

تحتاج إلى إضافة مرجع Punit.dll. إلى تطبيق وحدة التحكم ومكتبة الفصل التي تحتوي على الأساليب التي تحمل علامة السمات.

يمكنك الحصول على هذا كحزمة من Nuget. هنا.

قيادة Nuget: PM> حزمة تثبيت Punit

إذا كنت تفضل شفرة المصدر الكامل، فيمكنك العثور عليها جيثب هنا.

أقيم الطريقة التي تقيس فعلا وقت التنفيذ على هذا السؤال: https://stackoverflow.com/a/1048708/1139752.

أنا تغطي التنفيذ بمزيد من التفاصيل في ما يلي مشاركة مدونة.

هناك أيضا بعض أدوات Profiler المجانية التي قد تكون تستحق النظر إليها.

أفعل ضبط الأداء في C #. كل ما أحتاجه هو هذه التقنية. لا مشكلة.

انها تستند إلى فكرة بسيطة. إذا كنت تنتظر وقتا أطول بكثير من اللازم، فهذا يعني أن جزءا من البرنامج ينتظر أطول بكثير من اللازم، لشيء لا يلزم القيام به حقا.

وكيف ينتظر؟ دائما تقريبا، في موقع الاتصال، على مكدس المكالمات.

لذلك إذا قمت بإيقاف تشغيله فقط أثناء انتظارك، وإلقاء نظرة على مكدس المكالمات، فسترى ما ينتظره، وإذا لم يكن ضروريا حقا (لا يكون ذلك عادة لا)، فسترى لماذا على الفور.

لا تثق عينة واحدة فقط - هل تفعل ذلك عدة مرات. أي شيء يظهر أكثر من عينة مكدس واحدة هو شيء، إذا كنت تستطيع أن تفعل شيئا حيال ذلك، فسوف يوفر الكثير من الوقت.

لذلك ترى، الأمر لا يتعلق بوظائف التوقيت أو حساب عدد المرات التي يتم استدعاؤها. يتعلق الأمر بالانخفاض في البرنامج غير المعدد، عدة مرات، ويسأله ما يفعله ولماذا. إذا كان هناك شيء ما يضيع 80٪ (أو 20٪ أو أيا كان)، فسيكون 80٪ من الدورات في حالة عدم الضرورة حقا، لذلك فقط إسقاط عليها وإلقاء نظرة. لا تحتاج إلى قياس الدقة.

وهو يعمل مع مشاكل كبيرة. كما يعمل مع مشاكل صغيرة. وإذا كنت تفعل الشيء كله أكثر من مرة، لأن البرنامج يصبح بسرعة، فإن المشاكل الصغيرة تصبح أكبر نسبيا وأسهل في العثور عليها.

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

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

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