对于网上流传的“反射效率低”的说法,本人一直是相信的,这是动态和静态的区别,但反射到底影响多大程序一直没测试过,今天本着求是的态度做了个测试
using System; using System.Diagnostics; using System.Reflection; class Program4 { static void Main() { Assembly assembly = Assembly.GetExecutingAssembly(); Module[] modules = assembly.GetModules(false); Type type = assembly.GetType("ThreadClass"); MethodInfo mi = type.GetMethod("test"); Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000; i++) { ThreadClass.test(); } watch.Stop(); Console.WriteLine(watch.ElapsedTicks); watch.Restart(); for (int i = 0; i < 10000; i++) { mi.Invoke(null, null); } watch.Stop(); Console.WriteLine(watch.ElapsedTicks); Console.Read(); } } class ThreadClass { public static void test() { //nothing } }
要调用的方法里什么都不做,这样能更好地显示出“纯粹调用”的差距,结果打印:
772
9345
从结果上来看,不到10000个ticks(10000个ticks相当于1毫秒),这说明纯粹的调用差别,一万次以上才会有一毫秒的误差,够小了吧,假设调用的方法里再做点事,这点差别根本忽略不计。
这里要注意的是:调用之前已经获取到了MethodInfo,也许反射最大的性能问题应该在“加载程序集、获取类、获取方法信息”上,因此程序中只要在第一次调用时获取到MethodInfo,以后直接使用,根本没有什么效率的问题可以担心的,除非你傻到每次调用时都做“加载程序集、获取类、获取方法信息”这一系列动作。
总结:只要提前获取到MethodInfo(确切的说是第一次,之后直接使用),10000次以上的调用才有1毫秒的误差,根本不存在效率的担心,放心地使用反射吧!