[C#.NET] C#中使用反射的性能分析

最近在研究一个可配置系统的框架,在代码中大量使用了反射的方法,虽然借鉴到其他的语言,如java中反射性能都比较差,但是想到c#既然是一种强类型的语言,对于AppDomain中的类的调用应该性能不会差很多。 
  今天在mvp站点上看到有人说反射的性能很差,要避免使用,就写了一个简单的例子测试了一下 
  测试类如下: 
  namespace ReflectionTest.Test 
  { 
   public class CTester 
   { 
   public CTester() 
   { 
   a = 10; 
   } 
   
   public void test1() 
   { 
   a = (a - 0.0001) * 1.0001; 
   } 
   private double a; 
   public double geta() { return a; } 
   } 
  } 
  首先我们对于对象的构造进行测试 
  测试代码如下 
  private void test1() 
   { 
   label1.Text = ""; 
   label3.Text = ""; 
   DateTime now = DateTime.Now; 
   
   for (int i = 0; i < 1000; i++) 
   { 
   for (int j = 0; j < 100; j++) 
   { 
   
   CTester aTest = new CTester(); 
   } 
   } 
   
   TimeSpan spand = DateTime.Now - now; 
   label1.Text = "time past " + spand.ToString(); 
   } 
   
   private void test2() 
   { 
   label2.Text = ""; 
   label4.Text = ""; 
   DateTime now = DateTime.Now; 
   
   for (int i = 0; i < 1000; i++) 
   { 
   for (int j = 0; j < 100; j++) 
   { 
   Type theTest = Type.GetType("ReflectionTest.Test.CTester"); 
   object theobj = theTest.InvokeMember(null, BindingFlags.CreateInstance 
   , null, null, null); 
   } 
   } 
   
   TimeSpan spand = DateTime.Now - now; 
   label2.Text = "time past " + spand.ToString(); 
   } 
  测试结果直接调用的时间为16ms左右,而反射调用的则始终维持在5s 520ms左右,直接效率比较接近350倍。 
  对于这个测试,很有趣的一点是: 
  如果将test2中的Type theTest = Type.GetType("ReflectionTest.Test.CTester"); 
  移到循环之外,则相应的运行时间下降为1s 332 ms , 效率相差为20倍左右。 
   
   
  接下来我们对成员函数调用进行了测试: 
   
  test1: 
   
   private void button1_Click(object sender, EventArgs e) 
   { 
   DateTime now = DateTime.Now; 
   
   CTester aTest = new CTester(); 
   for (int i = 0; i < 1000; i++) 
   { 
   for (int j = 0; j < 100; j++) 
   { 
   
   aTest.test1(); 
   } 
   } 
   
   TimeSpan spand = DateTime.Now - now; 
   label1.Text = "time past " + spand.ToString(); 
   label3.Text = "value is now " + aTest.geta(); 
   } 
   
   
   
  test2: 
   
   private void button2_Click(object sender, EventArgs e) 
   { 
   DateTime now = DateTime.Now; 
   
   Type theTest = Type.GetType("ReflectionTest.Test.CTester"); 
   object theobj = theTest.InvokeMember(null, BindingFlags.CreateInstance 
   , null, null, null); 
   
   for (int i = 0; i < 1000; i++) 
   { 
   for (int j = 0; j < 100; j++) 
   { 
   
   theTest.InvokeMember("test1", BindingFlags.InvokeMethod, null, theobj, new object[0]); 
   } 
   } 
   CTester thewar = theobj as CTester; 
   
   TimeSpan spand = DateTime.Now - now; 
   label2.Text = "time past " + spand.ToString(); 
   label4.Text = "value is now " + thewar.geta(); 
   } 
   
   
  这个例子仅仅使用了invoke member进行测试 
  初步得到的数据如下: 
  test1 : 10 ms 
  test2: 2m 53ms 
   
  多次测试,得到的数据有轻微的波动,但是基本上的比例维持在1:250左右 
   
  对于静态方法调用 
  结果为5ms - 3m 164ms 
   
  用ILDASM查看声称的IL代码,发现除了函数调用外,声称的代码基本一致,可见性能的差别是由 
  callvirt instance object [mscorlib]System.Type::InvokeMember(string, 
   valuetype [mscorlib]System.Reflection.BindingFlags, 
   class [mscorlib]System.Reflection.Binder, 
   object, 
   object[]) 
  导致的,也就是反射引起的性能损失。 
   
   
  虽然只用invokemember尝试了一些简单的反射,但是很显然的,反射得消耗是非常大的。 
   
   
  作者Blog:http://blog.csdn.net/Leafwiz/

[C#.NET] C#中使用反射的性能分析

时间: 2024-08-05 15:59:41

[C#.NET] C#中使用反射的性能分析的相关文章

oralce中in和exists性能分析

在我们平常写sql的时候,in和exists这两个关键词会经常用到,所以我们有必要对它们的性能作一个分析. [in和exists性能分析]  1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,即数据量T1 << T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大

Android中RelativeLayout和LinearLayout性能分析

先看一些现象吧:用eclipse或者Android studio,新建一个Activity自动生成的布局文件都是RelativeLayout,或许你会认为这是IDE的默认设置问题,其实不然,这是由 android-sdk\tools\templates\activities\BlankActivity\root\res\layout\activity_simple.xml.ftl 这个文件事先就定好了的,也就是说这是Google的选择,而非IDE的选择.那SDK为什么会默认给开发者新建一个默认的

在Yii2中如何使用xhprof性能分析工具

1.系统版本:commond:@uname -aLinux Edge 3.16.0-36-generic #48~14.04.1-Ubuntu SMP Wed Apr 15 13:11:28 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 2.php版本commond:@php -vPHP 5.5.9-1ubuntu4.9 (cli) (built: Apr 17 2015 11:44:57) Copyright (c) 1997-2014 The PHP Gro

再看ExpressionTree,Emit,反射创建对象性能对比

[前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试的时候,发现居然比反射Activator.CreateInstance方法创建对象毫无优势可言.继而又写了个Expression Tree的对象工厂,发现和Emit不相上下,比起系统反射方法仍然无优势可言. 第一时间查看了园内大神们的研究,例如: Leven 的 探究.net对象的创建,质疑<再谈A

Java application 性能分析分享

性能分析的主要方式 监视:监视是一种用来查看应用程序运行时行为的一般方法.通常会有多个视图(View)分别实时地显示 CPU 使用情况.内存使用情况.线程状态以及其他一些有用的信息,以便用户能很快地发现问题的关键所在. 转储:性能分析工具从内存中获得当前状态数据并存储到文件用于静态的性能分析.Java 程序是通过在启动 Java 程序时添加适当的条件参数来触发转储操作的.它包括以下三种: 系统转储:JVM 生成的本地系统的转储,又称作核心转储.一般的,系统转储数据量大,需要平台相关的工具去分析,

转载:JAVA中的反射机制

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下看. 二,反射机制的作用:

java中的反射机制_____

一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下看. 二,反射机制的作用: 1,反编译:.class-->.java 2,通过反射机制访问java对象的属性,方法,构造方法等: 这样好像更容易理解一些,下边我们具

.Net 中的反射(序章) - Part.1

引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识点也很多,包括程序集.自定义特性.泛型等,想要完全掌握它非常不易.本文仅仅对反射做一个概要介绍,关于它更精深的内容,需要在实践中逐渐掌握.本文将分为下面几个部分介绍.Net中的反射: 序章,我将通过一个例子来引出反射,获得对反射的第一印象. 反射初步.Type类.反射普通类型.(修改中,近期发布..

【转】JAVA中的反射机制

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下看. 二,反射机制的作用: