سؤال

لديّ هذا الرمز ، أنه عند تبديل ترتيب استخدام AS و UseCast ، فإن أدائها مقايضة أيضًا.

using System;
using System.Diagnostics;
using System.Linq;

using System.IO;

class Test
{
    const int Size = 30000000;

    static void Main()
    {
        object[] values = new MemoryStream[Size];



        UsingAs(values);
        UsingCast(values);


        Console.ReadLine();
    }

    static void UsingCast(object[] values)
    {
        Stopwatch sw = Stopwatch.StartNew();
        int sum = 0;
        foreach (object o in values)
        {
            if (o is MemoryStream)
            {
                var m = (MemoryStream)o;
                sum += (int)m.Length;
            }
        }
        sw.Stop();
        Console.WriteLine("Cast: {0} : {1}", sum,
                          (long)sw.ElapsedMilliseconds);
    }

    static void UsingAs(object[] values)
    {
        Stopwatch sw = Stopwatch.StartNew();
        int sum = 0;
        foreach (object o in values)
        {

            if (o is MemoryStream)
            {
                var m = o as MemoryStream;
                sum += (int)m.Length;
            }
        }
        sw.Stop();
        Console.WriteLine("As: {0} : {1}", sum,
                          (long)sw.ElapsedMilliseconds);
    }


}

المخرجات:

As: 0 : 322
Cast: 0 : 281

عند القيام بذلك ...

UsingCast(values);
UsingAs(values);

... نتائج لهذا:

Cast: 0 : 322
As: 0 : 281

عندما تفعل هذا فقط ...

UsingAs(values);

... نتائج لهذا:

As: 0 : 322

عندما تفعل هذا فقط:

UsingCast(values);

... نتائج لهذا:

Cast: 0 : 322

بصرف النظر عن تشغيلهم بشكل مستقل ، كيف إبطال ذاكرة التخزين المؤقت حتى لا يتلقى الرمز الثاني الذي يتم قياسه الذاكرة المخزنة مؤقتًا للرمز الأول؟

وبغض النظر عن المعايير ، أحب فقط حقيقة أن المعالجات الحديثة تفعل هذا السحر التخزين المؤقت :-)

تعديل

كما نصح بتجربة هذا الرمز الأسرع (من المفترض) ...

static void UsingAsAndNullTest(object[] values)
{        
    Stopwatch sw = Stopwatch.StartNew();
    int sum = 0;
    foreach (object o in values)
    {
        var m = o as MemoryStream;
        if (m != null)
        {                
            sum += (int)m.Length;
        }
    }
    sw.Stop();
    Console.WriteLine("As and null test: {0} : {1}", sum,
                      (long)sw.ElapsedMilliseconds);
}

... النتيجة هي:

As and null test: 0 : 342

أبطأ من الرموز المذكورة أعلاه

تعديل]:

كما نصح بتسليم كل روتين نسختهم الخاصة ...

static void UsingAs(object[] values)
{
    object[] a = values.ToArray();

    Stopwatch sw = Stopwatch.StartNew();
    int sum = 0;
    foreach (object o in a)
    {

        if (o is MemoryStream)
        {
            var m = o as MemoryStream;
            sum += (int)m.Length;
        }
    }
    sw.Stop();
    Console.WriteLine("As: {0} : {1}", sum,
                      (long)sw.ElapsedMilliseconds);
}

static void UsingCast(object[] values)
{
    object[] a = values.ToArray();

    Stopwatch sw = Stopwatch.StartNew();
    int sum = 0;
    foreach (object o in a)
    {
        if (o is MemoryStream)
        {
            var m = (MemoryStream)o;
            sum += (int)m.Length;
        }
    }
    sw.Stop();
    Console.WriteLine("Cast: {0} : {1}", sum,
                      (long)sw.ElapsedMilliseconds);
}

... المخرجات:

Cast: 0 : 282
As: 0 : 282

الآن لديهم نفس النتائج ، شكرا ريموس!

تشغيل الجري وكما هو الحال بشكل مستقل ، فإنها تسفر أيضًا عن نفس النتيجة (أي 282). الآن ، أما السبب أصبحوا أسرع (من 322 إلى 282 ميلي ثانية) عندما يتم تسليم نسختهم الخاصة من Array ، لا يمكنني صنع أي شيء منه :-) هذه قصة أخرى تمامًا

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

المحلول

إذا كنت ترغب في إخراج ذاكرة التخزين المؤقت L2 من الصورة ، فما عليك سوى الاتصال بالاختبار الثاني على ذاكرة مختلفة من نفس الحجم.

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