using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
using System.Runtime.InteropServices;
using System.Management;
using System.Reflection;
class Program
{
static void Main(string[] args) { new Program()._Main(args); }
static Dictionary<Type, int[]> dicts = new Dictionary<Type, int[]>
{
{ typeof(LockFreeDictionary<,>), new int[] { 1, 4, 8 } },
// { typeof(ConcurrentDictionary<,>), new int[] { 1, 4, 8 } },
// { typeof(SpinLockDictionary<,>), new int[] { 1, 4, 8 } },
// { typeof(Dictionary<,>), new int[] { 1 } },
// { typeof(MonitorLockDictionary<,>), new int[] { 1, 4, 8 } },
};
static Dictionary<Type, Delegate> types = new Dictionary<Type, Delegate>
{
{ typeof(ObjectEq), (Func<int,Random,ObjectEq>)ObjectGetter },
{ typeof(String), (Func<int,Random,String>)StringGetter },
{ typeof(Guid), (Func<int,Random,Guid>)GuidGetter },
{ typeof(Int32), (Func<int,Random,Int32>)Int32Getter },
{ typeof(Int64), (Func<int,Random,Int64>)Int64Getter },
};
static Type[] tests = new Type[]
{
typeof(_RandomUsageTestTo1000<,>),
typeof(_45Sec10000MaxUsageTest<,>),
typeof(_45SecondRandomUsageTest<,>),
typeof(Add10E6Test<,>),
typeof(_60SecReadOnly1E5Test<,>),
};
void _Main(string[] args)
{
#if DEBUG
Console.WriteLine("DEBUG {0}", IntPtr.Size==4 ? "x86" : "x64");
#else
Console.WriteLine("RELEASE {0}", IntPtr.Size == 4 ? "x86" : "x64");
#endif
Console.WriteLine("{0} processors @{1}\n", Environment.ProcessorCount, Util.CPUSpeed());
foreach (var ttype in tests)
{
foreach (var dtype in dicts)
{
foreach (int c_tasks in dtype.Value.Where(c => c <= Environment.ProcessorCount))
{
foreach (var ktype in types)
{
foreach (var vtype in types)
{
//if (c_tasks != 8)
//continue;
DoTest(c_tasks, dtype.Key, ktype, vtype, ttype);
}
}
}
}
}
}
void DoTest(int c_tasks, Type dtype, KeyValuePair<Type, Delegate> ktype, KeyValuePair<Type, Delegate> vtype, Type ttype)
{
Type tester = ttype.MakeGenericType(new Type[] { ktype.Key, vtype.Key });
using (dynamic otester = Activator.CreateInstance(tester, new Object[] { c_tasks, ktype.Value, vtype.Value, dtype }))
{
otester.StartTest();
}
}
class ObjectEq : IEquatable<ObjectEq>
{
public bool Equals(ObjectEq other)
{
return Object.Equals(this, other);
}
}
static ObjectEq ObjectGetter(int num, Random r)
{
return new ObjectEq();
}
static Guid GuidGetter(int num, Random r)
{
var rgb = Guid.NewGuid().ToByteArray();
rgb[0] = (byte)num;
return new Guid(rgb);
}
static String StringGetter(int num, Random r)
{
return GuidGetter(num, r).ToString();
}
static Int32 Int32Getter(int num, Random r)
{
return (r.Next(int.MaxValue) & ~(byte)0x0F) | num;
}
static Int64 Int64Getter(int num, Random r)
{
byte[] rgb = new byte[7];
r.NextBytes(rgb);
return (long)
(((ulong)rgb[0] << 56) |
((ulong)rgb[1] << 48) |
((ulong)rgb[2] << 40) |
((ulong)rgb[3] << 32) |
((ulong)rgb[4] << 24) |
((ulong)rgb[5] << 16) |
((ulong)rgb[6] << 8) |
(uint)num);
}
};
struct Counts
{
public long add;
public long get;
public long update;
public long remove;
public TimeSpan ts;
public static Counts operator +(Counts a, Counts b)
{
Counts c = new Counts();
c.add = a.add + b.add;
c.get = a.get + b.get;
c.update = a.update + b.update;
c.remove = a.remove + b.remove;
c.ts = a.ts + b.ts;
return c;
}
};
class Util
{
public static uint CPUSpeed()
{
using (ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
return (uint)Mo["CurrentClockSpeed"];
}
}