using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace TypeLookupSpeed { unsafe class Program { static Dictionary m_typeObjLookup; static Dictionary m_intObjLookup; static Dictionary m_rthObjLookup; static Dictionary m_intptrObjLookup; static Dictionary m_longObjLookup; static unsafe void Main(string[] args) { m_typeObjLookup = new Dictionary(); m_intObjLookup = new Dictionary(); m_intptrObjLookup = new Dictionary(); m_rthObjLookup = new Dictionary(); m_longObjLookup = new Dictionary(); m_typeObjLookup.Add(typeof(sbyte), new object()); m_typeObjLookup.Add(typeof(byte), new object()); m_typeObjLookup.Add(typeof(short), new object()); m_typeObjLookup.Add(typeof(ushort), new object()); m_typeObjLookup.Add(typeof(int), new object()); m_typeObjLookup.Add(typeof(uint), new object()); m_typeObjLookup.Add(typeof(long), new object()); m_typeObjLookup.Add(typeof(ulong), new object()); m_typeObjLookup.Add(typeof(char), new object()); m_typeObjLookup.Add(typeof(float), new object()); m_typeObjLookup.Add(typeof(decimal), new object()); m_typeObjLookup.Add(typeof(double), new object()); m_typeObjLookup.Add(typeof(bool), new object()); m_typeObjLookup.Add(typeof(string), new object()); m_intObjLookup.Add(typeof(sbyte).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(byte).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(short).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(ushort).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(int).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(uint).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(long).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(ulong).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(char).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(float).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(decimal).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(double).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(bool).TypeHandle.Value.ToInt32(), new object()); m_intObjLookup.Add(typeof(string).TypeHandle.Value.ToInt32(), new object()); m_intptrObjLookup.Add(typeof(sbyte).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(byte).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(short).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(ushort).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(int).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(uint).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(long).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(ulong).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(char).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(float).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(decimal).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(double).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(bool).TypeHandle.Value, new object()); m_intptrObjLookup.Add(typeof(string).TypeHandle.Value, new object()); m_rthObjLookup.Add(typeof(sbyte).TypeHandle, new object()); m_rthObjLookup.Add(typeof(byte).TypeHandle, new object()); m_rthObjLookup.Add(typeof(short).TypeHandle, new object()); m_rthObjLookup.Add(typeof(ushort).TypeHandle, new object()); m_rthObjLookup.Add(typeof(int).TypeHandle, new object()); m_rthObjLookup.Add(typeof(uint).TypeHandle, new object()); m_rthObjLookup.Add(typeof(long).TypeHandle, new object()); m_rthObjLookup.Add(typeof(ulong).TypeHandle, new object()); m_rthObjLookup.Add(typeof(char).TypeHandle, new object()); m_rthObjLookup.Add(typeof(float).TypeHandle, new object()); m_rthObjLookup.Add(typeof(decimal).TypeHandle, new object()); m_rthObjLookup.Add(typeof(double).TypeHandle, new object()); m_rthObjLookup.Add(typeof(bool).TypeHandle, new object()); m_rthObjLookup.Add(typeof(string).TypeHandle, new object()); m_longObjLookup.Add(typeof(sbyte).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(byte).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(short).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(ushort).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(int).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(uint).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(long).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(ulong).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(char).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(float).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(decimal).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(double).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(bool).TypeHandle.Value.ToInt64(), new object()); m_longObjLookup.Add(typeof(string).TypeHandle.Value.ToInt64(), new object()); Stopwatch timer = new Stopwatch(); object obj; GC.Collect(2, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); timer.Start(); for (int i = 0; i < 100000; i++) { obj = m_typeObjLookup[typeof(sbyte)]; obj = m_typeObjLookup[typeof(byte)]; obj = m_typeObjLookup[typeof(short)]; obj = m_typeObjLookup[typeof(ushort)]; obj = m_typeObjLookup[typeof(int)]; obj = m_typeObjLookup[typeof(uint)]; obj = m_typeObjLookup[typeof(long)]; obj = m_typeObjLookup[typeof(ulong)]; obj = m_typeObjLookup[typeof(char)]; obj = m_typeObjLookup[typeof(float)]; obj = m_typeObjLookup[typeof(decimal)]; obj = m_typeObjLookup[typeof(double)]; obj = m_typeObjLookup[typeof(bool)]; obj = m_typeObjLookup[typeof(string)]; } timer.Stop(); Console.WriteLine("100,000 iterations of retrieve-by-type: {0}ms", timer.ElapsedMilliseconds); GC.Collect(2, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); timer.Reset(); timer.Start(); for (int i = 0; i < 100000; i++) { obj = m_intObjLookup[typeof(sbyte).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(byte).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(short).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(ushort).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(int).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(uint).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(long).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(ulong).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(char).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(float).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(decimal).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(double).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(bool).TypeHandle.Value.ToInt32()]; obj = m_intObjLookup[typeof(string).TypeHandle.Value.ToInt32()]; } timer.Stop(); Console.WriteLine("100,000 iterations of retrieve-by-runtime-type-pointer-value: {0}ms", timer.ElapsedMilliseconds); GC.Collect(2, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); timer.Reset(); timer.Start(); for (int i = 0; i < 100000; i++) { obj = m_intptrObjLookup[typeof(sbyte).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(byte).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(short).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(ushort).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(int).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(uint).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(long).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(ulong).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(char).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(float).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(decimal).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(double).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(bool).TypeHandle.Value]; obj = m_intptrObjLookup[typeof(string).TypeHandle.Value]; } timer.Stop(); Console.WriteLine("100,000 iterations of retrieve-by-runtime-type-pointer: {0}ms", timer.ElapsedMilliseconds); GC.Collect(2, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); timer.Reset(); timer.Start(); for (int i = 0; i < 100000; i++) { obj = m_rthObjLookup[typeof(sbyte).TypeHandle]; obj = m_rthObjLookup[typeof(byte).TypeHandle]; obj = m_rthObjLookup[typeof(short).TypeHandle]; obj = m_rthObjLookup[typeof(ushort).TypeHandle]; obj = m_rthObjLookup[typeof(int).TypeHandle]; obj = m_rthObjLookup[typeof(uint).TypeHandle]; obj = m_rthObjLookup[typeof(long).TypeHandle]; obj = m_rthObjLookup[typeof(ulong).TypeHandle]; obj = m_rthObjLookup[typeof(char).TypeHandle]; obj = m_rthObjLookup[typeof(float).TypeHandle]; obj = m_rthObjLookup[typeof(decimal).TypeHandle]; obj = m_rthObjLookup[typeof(double).TypeHandle]; obj = m_rthObjLookup[typeof(bool).TypeHandle]; obj = m_rthObjLookup[typeof(string).TypeHandle]; } timer.Stop(); Console.WriteLine("100,000 iterations of retrieve-by-runtime-type-handle: {0}ms", timer.ElapsedMilliseconds); GC.Collect(2, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); timer.Reset(); timer.Start(); for (int i = 0; i < 100000; i++) { obj = m_longObjLookup[typeof(sbyte).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(byte).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(short).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(ushort).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(int).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(uint).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(long).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(ulong).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(char).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(float).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(decimal).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(double).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(bool).TypeHandle.Value.ToInt64()]; obj = m_longObjLookup[typeof(string).TypeHandle.Value.ToInt64()]; } timer.Stop(); Console.WriteLine("100,000 iterations of retrieve-by-runtime-type-handle-actual-pointer: {0}ms", timer.ElapsedMilliseconds); Console.ReadLine(); } } }