كيفية إبطال ذاكرة التخزين المؤقت عند القياس؟
-
30-09-2019 - |
سؤال
لديّ هذا الرمز ، أنه عند تبديل ترتيب استخدام 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 من الصورة ، فما عليك سوى الاتصال بالاختبار الثاني على ذاكرة مختلفة من نفس الحجم.