比较一下以“反射”和“表达式”执行方法的性能差异【转】
由于频繁地使用反射会影响性能,所以ASP.NET MVC采用了表达式树的方式来执行目标Action方法。具体来说,ASP.NET MVC会构建一个表达式来体现针对目标Action方法的执行,并且将该表达式编译成可执行代码。编译后的可执行代码体现为一个委托对象,该委托对象会被缓存起来以用于针对同一个Action方法的执行。为了让大家能够和直观地理解两种(直接利用反射和利用表达式编译后的委托对象)方法执行在性能上的差异,我们来做一个简单的实例演示。我们在一个控制台应用中定义了如下一个Foobar类型,它的Invoke方法就是我们需要测试的目标方法。简单起见,我们没有为它定义任何参数,方法本身也不需要执行任何具体操作。
1: public class Foobar
2: {
3: public void Invoke(){}
4: }
具体的测试程序如下所示。三个静态属性Target、Method和Executor分别代表执行的目标对象、目标方法和表达式编译后生成的委托对象,后者通过调用静态方法CreateExecutor方法创建。
1: class Program
2: {
3:
4: public static Foobar Target { get; private set; }
5: public static MethodInfo Method { get; private set; }
6: public static Action<Foobar> Executor { get; private set; }
7:
8: private static object[] args = new object[0];
9:
10: private static Action<Foobar> CreateExecutor(MethodInfo method)
11: {
12: ParameterExpression target = Expression.Parameter(typeof(Foobar),"target");
13: Expression expression = Expression.Call(target, method);
14: return Expression.Lambda<Action<Foobar>>(expression, target).Compile();
15: }
16:
17: static Program()
18: {
19: Target = new Foobar();
20: Method = typeof(Foobar).GetMethod("Invoke");
21: Executor = CreateExecutor(Method);
22: }
23:
24: static void Main()
25: {
26: Console.WriteLine("{0,-10}{1,-12}{2}", "Times", "Reflection", "Expression");
27: Test(100000);
28: Test(1000000);
29: Test(10000000);
30: }
31:
32: private static void Test(int times)
33: {
34: Stopwatch stopwatch = new Stopwatch();
35:
36: stopwatch.Start();
37: for (int i = 0; i < times; i++)
38: {
39: Method.Invoke(Target, args);
40: }
41: long elapsed1 = stopwatch.ElapsedMilliseconds;
42:
43: stopwatch.Restart();
44: for (int i = 0; i < times; i++)
45: {
46: Executor(Target);
47: }
48: long elapsed2 = stopwatch.ElapsedMilliseconds;
49:
50: Console.WriteLine("{0,-10}{1,-12}{2}", times, elapsed1, elapsed2);
51: }
52: }
测试方法Test的参数times表示我们执行目标方法的次数。在该方法中,我们调用MethodInfo对象的Invoke方法以反射的形式执行目标方法,然后利用Executor属性表示的委托对象来执行目标方法,并将它们执行的时间(以毫秒为单位)输出来。在作为程序入口的Main方法中,我们先后三个调用Test方法,并将执行目标方法的次数分别设置为100,000(十万)、1,000,000(百万)和10,000,000(千万)。运行程序后我们会在控制台上得到如下所示的输出结果,可以看出直接采用反射方式执行某个方法确实在性能上要差一些,但是差异其实不算明显。很多人总是觉得在程序中使用反射会对性能造成很大的影响,其实在我看来在很多情况下反射本身都不是造成性能瓶颈的元凶。
1: Times Reflection Expression
2: 100000 34 2
3: 1000000 273 28
4: 10000000 2627 284
比较一下以“反射”和“表达式”执行方法的性能差异【转】相关推荐
- linux 在沙盒中运行,Linux容器的细粒度沙盒策略执行方法与流程
本发明专利属于计算机技术领域,涉及云计算安全方向.更具体的讲,本发明专利涉及一种Linux容器的细粒度沙盒策略执行方法. 背景技术: Linux容器技术采用命名空间将进.文件.设备等资源进行隔离,为用 ...
- 利用反射动态实例化类执行方法并传值
/// <summary> /// 利用反射动态实例化类执行方法并传值 /// </summary> /// <param ...
- 【JavaLearn】(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例
目录 1. 反射 1.1 反射引入 1.2 反射的入口-Class类 2. 认识 Class 类 3. 使用反射创建对象 4. 使用反射操作属性 5. 使用反射执行方法 6. 使用反射操作泛型 6.2 ...
- 【JavaLearn】#(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例
1. 反射 1.1 反射引入 编译时,知道类或对象的具体信息,此时直接对类和对象进行操作即可 编译时不知道类或对象的具体信息,只有运行时知道,需要使用反射来实现 ==> 比如驱动的类的名称放在 ...
- 06 面向对象之:反射,双下方法
一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语 ...
- python全栈开发基础【第十七篇】面向对象反射和内置方法
一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...
- java args例子_Spring AOP中使用args表达式的方法示例
本文实例讲述了Spring AOP中使用args表达式的方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchem ...
- 面向对象之: 反射和双下方法
目录 一, 反射 二, 函数VS方法 三, 双下方法 一, 反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 p ...
- 【More Effective C#】LINQ表达式与方法调用的映射
LINQ构建在两个概念之上,一种查询语言和一系列将查询语言转换成方法调用的实现.在编译时,编译器将LINQ表达式(LINQ to object)转换成方法调用. .Net基础类库提供了两种扩展方法.S ...
最新文章
- 千万级并发HAproxy均衡负载系统介绍
- OpenCV常遇问题解决方法汇总
- 【Java】Java连接Mysql数据库的demo示例
- sublime text3使用教程python_Sublime Text 编辑器配置 Python解释器简易教程
- 一致性 Hash 算法原理总结
- jmh 基准测试_JMH:如何设置和运行JMH基准
- linux 脚本中的push,linux shell之pushd、popd和dirs的使用讲解
- const与static的区别
- Win10 Edge浏览器续航碾压火狐/Chrome
- VCL组件之TScrollBar
- ppt里quicktime不可用_PPT插入音乐、视频的全部疑难问题,一站式帮你解决!
- 容器技术Docker K8s 29 容器服务ACK基础与进阶-弹性伸缩
- MAC OS升级记录
- 18-19款迈巴赫S400改装原厂3D大柏林之声,天籁之音
- selenium click点击无反应问题解析
- centos8搭建maven私服(含nexus-3.28.1-01.tar.gz下载链接)
- powershell中 find 命令报参数格式不正确
- python樱花代码_武大学生用Python敲出樱花开放(附源码)
- “穷苦乡村”小伙就得安于现状,2021必看
- 国企的判断标准是什么 怎么查企业是私企还是国企
热门文章
- 信息学奥赛一本通 1056:点和正方形的关系 | OpenJudge NOI 1.4 18
- 信息学奥赛一本通(1029:计算浮点数相除的余)
- 树形结构 —— 树与二叉树 —— 树的中心
- 欧拉定理(洛谷-P5091)(十进制快速幂实现)
- Telephone Wire(POJ-3612)
- 基础算法 —— 递归/递推 —— 汉诺塔问题(Hanoi)
- 基础算法 —— 高精度计算 —— 高精度除法
- 信息学奥赛C++语言:由大到小输出1~100的整数
- 5 MM配置-企业结构-分配-给公司代码分配工厂
- 14 CO配置-控制-内部订单-维护定单编号范围