反射实例化类

public class Person
{
public string Name { get; set; } public Person(string name)
{
this.Name = name;
} public string Say(string msg)
{
return $"{Name}: {msg}";
}
} class Program
{
// 测试次数
const int count = 10000000; static void Main(string[] args)
{
CreateInstance0();
CreateInstance1();
CreateInstance2();
CreateInstance3();
CreateInstance4(); Console.Read();
} static void CreateInstance0()
{
Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
Person person = new Person("张三");
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - new");
} static void CreateInstance1()
{
Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
object person = Activator.CreateInstance(typeof(Person), "张三");
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Activator.CreateInstance");
} static void CreateInstance2()
{
Assembly assembly = Assembly.GetExecutingAssembly(); Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
Person obj = (Person)assembly.CreateInstance("ConsoleTest.Person", true, BindingFlags.Default, null, new object[] { "张三" }, null, null);
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance");
} static void CreateInstance3()
{
Assembly assembly = Assembly.GetExecutingAssembly(); Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
Type type = assembly.GetType("ConsoleTest.Person");
object person = Activator.CreateInstance(type, "张三");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance1");
} static void CreateInstance4()
{
Assembly assembly = Assembly.GetExecutingAssembly(); Stopwatch watch = new Stopwatch();
watch.Start(); Type type = assembly.GetType("ConsoleTest.Person");
for (var i = 0; i < count; i++)
{
object person = Activator.CreateInstance(type, "张三");
}
watch.Stop();
Console.WriteLine($"{watch.Elapsed} - Assembly.CreateInstance2");
}
}

  • 通过反射实例化对象,要比直接 new 要慢 50 倍左右
  • assembly.CreateInstance 要比 Activator.CreateInstance 慢,主要的性能损耗在 Assembly.GetType

反射调用类的方法

class Program
{
// 测试次数
const int count = 10000000; static void Main(string[] args)
{
InvokeMethod0();
InvokeMethod1();
InvokeMethod2();
InvokeMethod3();
InvokeMethod4(); Console.Read();
} static void InvokeMethod0()
{
Person person = new Person("张三"); Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
string name = person.Say("Hello World!");
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - 直接调用");
} static void InvokeMethod1()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), "张三"); Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
string name = person.Say("Hello World!");
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - 反射缓存类调用");
} static void InvokeMethod2()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), "张三");
MethodInfo method = typeof(Person).GetMethod(nameof(Person.Say), new Type[] { typeof(string) });
Func<string, string> func = (Func<string, string>)method.CreateDelegate(typeof(Func<string, string>), person); Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
string result = func("Hello World!");
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - 使用反射创建出来的委托调用");
} static void InvokeMethod3()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), "张三"); MethodInfo method = typeof(Person).GetMethod(nameof(Person.Say), new Type[] { typeof(string) }); object[] parameters = new object[] { "Hello World!" }; Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
string name = (string)method.Invoke(person, parameters);
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - 使用反射得到的方法缓存调用");
} static void InvokeMethod4()
{
Person person = (Person)Activator.CreateInstance(typeof(Person), "张三"); object[] parameters = new object[] { "Hello World!" }; Stopwatch watch = new Stopwatch();
watch.Start(); for (var i = 0; i < count; i++)
{
string result = (string)(typeof(Person).GetMethod(nameof(Person.Say))?.Invoke(person, parameters));
} watch.Stop();
Console.WriteLine($"{watch.Elapsed} - 直接使用反射调用");
}
}

  • 反射得到实例后调用方法和直接调用方法效率一样
  • 缓存反射方法调用和直接使用反射调用都非常耗效率

最新文章

  1. linux创建进程fork的方法步骤
  2. android如何播放和录制音频
  3. autoproxy 规则
  4. 理解OAuth 2.0 -摘自网络
  5. 音频PCM格式
  6. hdu 1429 胜利大逃亡(续)(bfs+位压缩)
  7. Visual studio 扩展工具
  8. Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift
  9. 厂商自定义USB设备固件程序及特性
  10. MySQL----alter table modify | change的不同
  11. golang环境搭建
  12. 学习WPF
  13. LeetCode 142. Linked List Cycle II 判断环入口的位置 C++/Java
  14. 视觉机器学习------KNN学习
  15. Linux发展历史
  16. SpringBoot企业级框架
  17. UserControl VS TemplatedControl
  18. https://stackoverflow.com/questions/40949967/running-storm-from-intellij-nimbus-error
  19. [转]PostgreSQL Replication之扩展与BDR
  20. java.lang.IllegalStateException: BeanFactory not initialized or already closed - call &#39;refresh&#39; before accessing beans via the ApplicationContext

热门文章

  1. FridaHook框架学习(1)
  2. linux下的ARP攻击(kali)
  3. java HashMap and HashMultimap 区别
  4. AS中的协议---IGP、EGP(BGP)
  5. Kubernetes --(k8s)Job、CronJob
  6. Java 复习整理day03
  7. 关于base64编码Encode和Decode编码的几种方式--Java
  8. MySQL数据库迁移与MySQL数据库批量恢复
  9. xls与csv文件的区别
  10. A - 欧拉回路