反射实例化类

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} - 直接使用反射调用");
}
}

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

【C#】反射的用法及效率对比的更多相关文章

  1. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  2. golang 浮点数 取精度的效率对比

    需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" " ...

  3. string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比

    关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...

  4. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  5. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  6. FileInputStream 与 BufferedInputStream 效率对比

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550158.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  7. java中多种写文件方式的效率对比实验

    一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...

  8. SIMD---SSE系列及效率对比

    SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...

  9. Snapman系统中TCC执行效率和C#执行效率对比

    Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 4.MD5算法 这是C ...

随机推荐

  1. Mark基本语法

    Markdown语法 1. 标题 样式的标题在行的开头使用1-6个#,对应于标题级别1-6.例如: 2.引用 在引用中再嵌套一个引用(在用">"的段落中使用"> ...

  2. linux设置用户登录提示

    1./etc/motd文件的用途          /etc/motd即message of today(布告栏信息),每次用户登录时,/etc/motd文件的内容会显示在用户的终端.         ...

  3. CF-1445 C - Division 数论,质因数,唯一分解定理

    题意 给定一个 \(p (p\le 10^{18})\), 一个 \(q(q \le 10^9)\), 要找到一个最大的 \(x\) 满足: \(p \%x = 0\) \(q \% x \neq 0 ...

  4. Codeforces Round #652 (Div. 2) D. TediousLee(dp)

    题目链接:https://codeforces.com/contest/1369/problem/D 题意 最初有一个结点,衍生规则如下: 如果结点 $u$ 没有子结点,添加 $1$ 个子结点 如果结 ...

  5. AtCoder Beginner Contest 171

    比赛链接:https://atcoder.jp/contests/abc171/tasks A - αlphabet 题意 给出一个字母,如果为大写输出 'A',如果为小写输出 'a' . 代码 #i ...

  6. Codeforces Round #647 (Div. 2) B. Johnny and His Hobbies(枚举)

    题目链接:https://codeforces.com/contest/1362/problem/B 题意 有一个大小及元素值均不超过 $1024$ 的正整数集合,求最小正整数 $k$,使得集合中的每 ...

  7. Codeforces Round #676 (Div. 2) XORwice、Putting Bricks in the Wall、Palindromifier

    题目链接:XORwice 题意:给你两个数a.b.求一个数x,使得((a异或x)+(b异或x))这个值最小,输出最小那个x 题解: 输出(a|b)-(a&b)就行(猜了一手 代码: #incl ...

  8. AtCoder Beginner Contest 179 E - Sequence Sum (模拟)

    题意:\(f(x,m)\)表示\(x\ mod\ m\),\(A_{1}=1\),而\(A_{n+1}=f(A^{2}_{n},M)\),求\(\sum^{n}_{i=1}A_{i}\). 题解:多算 ...

  9. C# Dictionary(字典)源码解析&效率分析

    通过查阅网上相关资料和查看微软源码,我对Dictionary有了更深的理解. Dictionary,翻译为中文是字典,通过查看源码发现,它真的内部结构真的和平时用的字典思想一样. 我们平时用的字典主要 ...

  10. 1.PowerShell DSC概述

    什么是PowerShell DSC DSC 是一个声明性平台,用于配置.部署和管理系统. PowerShell PowerShell 是构建于 .NET 上基于任务的命令行 shell 和脚本语言. ...