用delegate调用替代基于反射的函数调用
众所周知,C#的反射性能开销比较大,比如通过反射的方式来调用一个函数, 相比直接调用,反射下的性能是急剧下降的。
为了加强性能,可以通过MethodInfo来创建Delegate,通过调用Delegate来加强性能。
我们通过以下测试代码来测试一下,下面3种函数调用的性能消耗:
1.直接函数调用
2.通过delegate调用
3.通过反射调用
4.通过动态修改IL代码来加速调用(待尝试)
using System; using System.Reflection; using System.Diagnostics; namespace ConsoleApp2 { public delegate void VoidFuncVoid(); class Test { public void on_xxx() { float x = 100.0f; x *= x * x * x * x * x * x * x; } } class Program { static void Main(string[] args) { Test test = new Test(); var me = test.GetType().GetMethod("on_xxx"); var de = (VoidFuncVoid)me.CreateDelegate(typeof(VoidFuncVoid), test); Stopwatch sw = new Stopwatch(); { sw.Start(); for (int i = 0; i < 10000; i++) { test.on_xxx(); } sw.Stop(); Console.WriteLine("call method with direct " + sw.ElapsedTicks); sw.Reset(); } { sw.Start(); for (int i = 0; i < 10000; i++) { de(); } sw.Stop(); Console.WriteLine("call method with delegate " + sw.ElapsedTicks); sw.Reset(); } { sw.Start(); for (int i = 0; i < 10000; i++) { me.Invoke(test, null); } sw.Stop(); Console.WriteLine("call method with reflection " + sw.ElapsedTicks); sw.Reset(); } Console.ReadKey(); } } }
输出结果如下:

总结:通过delegate调用性能的性能开销最小,甚至比代码直接调用函数更小。