How to invalidate cache when benchmarking?

Posted by Michael Buen on Stack Overflow See other posts from Stack Overflow or by Michael Buen
Published on 2010-04-21T03:03:25Z Indexed on 2010/04/21 3:23 UTC
Read the original article Hit count: 398

I have this code, that when swapping the order of UsingAs and UsingCast, their performance also swaps.

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);
    }


}

Outputs:

As: 0 : 322
Cast: 0 : 281

When doing this...

UsingCast(values);
UsingAs(values);

...Results to this:

Cast: 0 : 322
As: 0 : 281

When doing just this...

UsingAs(values);

...Results to this:

As: 0 : 322

When doing just this:

UsingCast(values);

...Results to this:

Cast: 0 : 322

Aside from running them independently, how to invalidate the cache so the second code being benchmarked won't receive the cached memory of first code?

Benchmarking aside, just loved the fact that modern processors do this caching magic :-)

© Stack Overflow or respective owner

Related posts about benchmarking

Related posts about proper-benchmarking