quiz10.cs
// quiz10.cs
// this program is offered as is with no warranty implied and confers no rights .
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Quiz10
{
class Program
{
[ThreadStatic]
private static Dictionary myItems = new Dictionary();
private static LocalDataStoreSlot slotStatic;
[ThreadStatic]
private static Data myData = new Data();
class Data
{
public int i = 0;
}
static void Main(string[] args)
{
slotStatic = Thread.AllocateNamedDataSlot("foo");
Thread.SetData(slotStatic, new Data());
myItems["foo"] = new Data();
const int count = 10000000;
// get any jitting out of the way
Test1();
Test2();
Test3();
Test4();
int i = 0;
System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
s.Start();
for (i = 0; i < count; i++) Test1();
s.Stop();
Console.WriteLine("Test1: Named Slot {0:n0}ms", s.ElapsedMilliseconds);
s.Reset();
s.Start();
for (i = 0; i < count; i++) Test2();
s.Stop();
Console.WriteLine("Test2: Numbered Slot {0:n0}ms", s.ElapsedMilliseconds);
s.Reset();
s.Start();
for (i = 0; i < count; i++) Test3();
s.Stop();
Console.WriteLine("Test3: Thread-local dictionary {0:n0}ms", s.ElapsedMilliseconds);
s.Reset();
s.Start();
for (i = 0; i < count; i++) Test4();
s.Stop();
Console.WriteLine("Test4: Thread-local direct {0:n0}ms", s.ElapsedMilliseconds);
}
[System.Runtime.CompilerServices.MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
static void Test1()
{
LocalDataStoreSlot slot = Thread.GetNamedDataSlot("foo");
Data d = (Data)Thread.GetData(slot);
d.i++;
}
[System.Runtime.CompilerServices.MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
static void Test2()
{
Data d = (Data)Thread.GetData(slotStatic);
d.i++;
}
[System.Runtime.CompilerServices.MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
static void Test3()
{
Data d = myItems["foo"];
d.i++;
}
[System.Runtime.CompilerServices.MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
static void Test4()
{
myData.i++;
}
}
}
Comments
- Anonymous
July 18, 2006
I actually posted this quiz quite a while ago but a comment with the correct solution came in so quickly... - Anonymous
July 18, 2006
PingBack from http://microsoft.wagalulu.com/2006/07/18/performance-quiz-10-thread-local-storage-solution/