--- /dev/null
+using System;
+using System.Reflection;
+
+class T {
+
+ public T () {
+ }
+
+ const int count = 1000000;
+
+ static void use_new () {
+ for (int i = 0; i < count; ++i)
+ new T ();
+ }
+
+ object Clone () {
+ return MemberwiseClone ();
+ }
+
+ static void use_clone () {
+ T t = new T ();
+ for (int i = 0; i < count; ++i)
+ t.Clone ();
+ }
+
+ static void use_activator () {
+ for (int i = 0; i < count; ++i)
+ Activator.CreateInstance (typeof (T));
+ }
+
+ static void use_ctor () {
+ ConstructorInfo ctor = typeof (T).GetConstructor (Type.EmptyTypes);
+ for (int i = 0; i < count; ++i)
+ ctor.Invoke (null);
+ }
+
+ static void Main () {
+ long start, end, new_val, perc;
+ start = Environment.TickCount;
+
+ start = Environment.TickCount;
+ use_new ();
+ end = Environment.TickCount;
+ Console.WriteLine ("new took {0}", end-start);
+ new_val = end-start;
+
+ start = Environment.TickCount;
+ use_clone ();
+ end = Environment.TickCount;
+ perc = ((end-start-new_val) * 100) / new_val;
+ Console.WriteLine ("clone took {0} {1} %", end-start, perc);
+
+ start = Environment.TickCount;
+ use_activator ();
+ end = Environment.TickCount;
+ perc = ((end-start-new_val) * 100) / new_val;
+ Console.WriteLine ("activator took {0} {1} %", end-start, perc);
+
+ start = Environment.TickCount;
+ use_ctor ();
+ end = Environment.TickCount;
+ perc = ((end-start-new_val) * 100) / new_val;
+ Console.WriteLine ("ctor took {0} {1} %", end-start, perc);
+
+ }
+}
+