public void MultiMethod_Invoke_Is_Faster_Than_Cached_Dynamic_Invoke_To_Target_Method() { int count = 100000; DispatchTestHelper target = new DispatchTestHelper(); D d1 = new D(), d2 = new D(), d3 = new D(); MethodInfo method = typeof(DispatchTestHelper).GetMethod( "MM3", BindingFlags.Instance | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(D), typeof(D), typeof(D) }, null); DateTime start = DateTime.Now; for (int i = 0; i < count; ++i) { method.Invoke(target, new object[] { d1, d2, d3 }); } double dynamicInvokeDuration = (DateTime.Now - start).TotalMilliseconds; start = DateTime.Now; for (int i = 0; i < count; ++i) { target.MM3(d1, d2, d3); } double multiMethodDuration = (DateTime.Now - start).TotalMilliseconds; Assert.Less(multiMethodDuration, dynamicInvokeDuration, string.Format("dynamic invoke={0} is faster than multi method invoke={1}", dynamicInvokeDuration, multiMethodDuration)); Console.WriteLine("multi method invoke={0} is faster than dynamic invoke={1}", multiMethodDuration, dynamicInvokeDuration); }
public void MultiMethod_Action_And_Function_Wrappers_Will_Dispatch_To_Correct_Method() { DispatchTestHelper check = new DispatchTestHelper(); check.MM1(new D()); Assert.AreEqual("D", check.LastResult); check.MM2(new D(), new D()); Assert.AreEqual("DD", check.LastResult); check.MM3(new D(), new D(), new D()); Assert.AreEqual("DDD", check.LastResult); check.MM4(new D(), new D(), new D(), new D()); Assert.AreEqual("DDDD", check.LastResult); Assert.AreEqual("D", check.FF1(new D())); Assert.AreEqual("DD", check.FF2(new D(), new D())); Assert.AreEqual("DDD", check.FF3(new D(), new D(), new D())); Assert.AreEqual("DDDD", check.FF4(new D(), new D(), new D(), new D())); }