反射(Reflection)的性能分析

时间:2021-08-17 08:14:37

记得老早以前就看到有人把反射称之为“性能杀手",正好目前正在做的erp系统为了实现扩展,系统就是架构在反射的基础之上,数据交互也都是通过反射来实现。首先系统会产生太多dll,现在刚刚起步,已经高达43个之多,由于erp系统具有很复杂的业务功能,产品在发布阶段很可能产生200甚至更多的dll,且不说这几百个项目在调试的时候,漫长的等待是多么的痛苦,在产品推出去之后,这么多的dll的版本如何维护?多现在为止,除了windows还没有见过dll超过百的系统,难道我们的系统真的比windows还要难?这些暂且不提,先测试一下反射在系统应用的性能情况,测试程序如下:

反射(Reflection)的性能分析// 被测试类
反射(Reflection)的性能分析
using  System;
反射(Reflection)的性能分析
using  System.Collections.Generic;
反射(Reflection)的性能分析
using  System.Text;
反射(Reflection)的性能分析
反射(Reflection)的性能分析
namespace  ClassLibrary1
反射(Reflection)的性能分析反射(Reflection)的性能分析
{
反射(Reflection)的性能分析    
public class CTester
反射(Reflection)的性能分析反射(Reflection)的性能分析    
{
反射(Reflection)的性能分析        
public CTester()
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            a 
= 10;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析
反射(Reflection)的性能分析
反射(Reflection)的性能分析        
public void test1()
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            a 
= (a - 0.0001* 1.0001;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析        
private double a;
反射(Reflection)的性能分析反射(Reflection)的性能分析        
public double geta() return a; }
反射(Reflection)的性能分析    }

反射(Reflection)的性能分析}

反射(Reflection)的性能分析
反射(Reflection)的性能分析
反射(Reflection)的性能分析反射(Reflection)的性能分析
///测试类
反射(Reflection)的性能分析using  System;
反射(Reflection)的性能分析
using  System.Collections.Generic;
反射(Reflection)的性能分析
using  System.Text;
反射(Reflection)的性能分析
using  System.Reflection;
反射(Reflection)的性能分析
using  System.Collections;
反射(Reflection)的性能分析
反射(Reflection)的性能分析
namespace  ConsoleApplication2
反射(Reflection)的性能分析反射(Reflection)的性能分析
{
反射(Reflection)的性能分析   
反射(Reflection)的性能分析        
public class CTester
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            
public CTester()
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                a 
= 10;
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析        
反射(Reflection)的性能分析
反射(Reflection)的性能分析            
public void test1()
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                a 
= (a - 0.0001* 1.0001;
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析            
private double a;
反射(Reflection)的性能分析反射(Reflection)的性能分析            
public double geta() return a; }
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析
反射(Reflection)的性能分析   
反射(Reflection)的性能分析
反射(Reflection)的性能分析
反射(Reflection)的性能分析    
class Program
反射(Reflection)的性能分析反射(Reflection)的性能分析    
{
反射(Reflection)的性能分析        
private string test1()
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            
int now = System.Environment.TickCount;
反射(Reflection)的性能分析           
反射(Reflection)的性能分析            
for (int i = 0; i < 1000; i++)
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                
for (int j = 0; j < 100; j++)
反射(Reflection)的性能分析反射(Reflection)的性能分析                
{
反射(Reflection)的性能分析                    CTester aTest 
= new CTester();
反射(Reflection)的性能分析                    aTest.test1();
反射(Reflection)的性能分析                    
反射(Reflection)的性能分析                }

反射(Reflection)的性能分析            }

反射(Reflection)的性能分析
反射(Reflection)的性能分析            
string time = (System.Environment.TickCount - now).ToString();
反射(Reflection)的性能分析            
return time;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析        
static Hashtable table = new Hashtable();
反射(Reflection)的性能分析        
private string test3()
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            
int now = System.Environment.TickCount;
反射(Reflection)的性能分析           
反射(Reflection)的性能分析            
for (int i = 0; i < 1000; i++)
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                
for (int j = 0; j < 100; j++)
反射(Reflection)的性能分析反射(Reflection)的性能分析                
{
反射(Reflection)的性能分析                    Type theTest 
= null;
反射(Reflection)的性能分析                    
if (table.ContainsKey("ConsoleApplication2.CTester"))
反射(Reflection)的性能分析反射(Reflection)的性能分析                    
{
反射(Reflection)的性能分析                        theTest 
= table["ConsoleApplication2.CTester"as Type;
反射(Reflection)的性能分析                    }

反射(Reflection)的性能分析                    
else
反射(Reflection)的性能分析反射(Reflection)的性能分析                    
{
反射(Reflection)的性能分析                        theTest 
= Type.GetType("ConsoleApplication2.CTester");
反射(Reflection)的性能分析                        table.Add(
"ConsoleApplication2.CTester", theTest);
反射(Reflection)的性能分析                    }

反射(Reflection)的性能分析                    ConsoleApplication2.CTester theobj 
= theTest.InvokeMember(null, BindingFlags.CreateInstance
反射(Reflection)的性能分析                        , 
nullnullnullas ConsoleApplication2.CTester;
反射(Reflection)的性能分析                    theobj.test1();
反射(Reflection)的性能分析                }

反射(Reflection)的性能分析            }

反射(Reflection)的性能分析
反射(Reflection)的性能分析            
string  time =(System.Environment.TickCount - now).ToString();
反射(Reflection)的性能分析            
return  time;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析        
private string test2()
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            
int now = System.Environment.TickCount;
反射(Reflection)的性能分析            
for (int i = 0; i < 1000; i++)
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                
for (int j = 0; j < 100; j++)
反射(Reflection)的性能分析反射(Reflection)的性能分析                
{
反射(Reflection)的性能分析                    Type theTest 
= theTest = Type.GetType("ConsoleApplication2.CTester"); ;
反射(Reflection)的性能分析                    ConsoleApplication2.CTester theobj 
= theTest.InvokeMember(null, BindingFlags.CreateInstance
反射(Reflection)的性能分析                        , 
nullnullnullas ConsoleApplication2.CTester;
反射(Reflection)的性能分析                    theobj.test1();
反射(Reflection)的性能分析                }

反射(Reflection)的性能分析            }

反射(Reflection)的性能分析
反射(Reflection)的性能分析            
string  time =(System.Environment.TickCount - now).ToString();
反射(Reflection)的性能分析            
return time;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析          
static object InvokeMehod(string FileName,
反射(Reflection)的性能分析            
string MethodName,
反射(Reflection)的性能分析            
object[] Args)
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            Assembly a 
= Assembly.LoadFrom(FileName);
反射(Reflection)的性能分析
反射(Reflection)的性能分析
反射(Reflection)的性能分析            MethodInfo method 
= null;
反射(Reflection)的性能分析            Type HereType 
= null;
反射(Reflection)的性能分析            
foreach (Module m in a.GetModules())
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                
foreach (Type t in m.GetTypes())
反射(Reflection)的性能分析反射(Reflection)的性能分析                
{
反射(Reflection)的性能分析
反射(Reflection)的性能分析                    
foreach (MethodInfo mInfo in t.GetMethods())
反射(Reflection)的性能分析反射(Reflection)的性能分析                    
{
反射(Reflection)的性能分析                        
if (mInfo.Name == MethodName)
反射(Reflection)的性能分析反射(Reflection)的性能分析                        
{
反射(Reflection)的性能分析                            ParameterInfo[] pInfo 
= mInfo.GetParameters();
反射(Reflection)的性能分析                            
if (pInfo.Length == Args.Length)
反射(Reflection)的性能分析反射(Reflection)的性能分析                            
{
反射(Reflection)的性能分析                                
bool same = true;
反射(Reflection)的性能分析                                
for (int i = 0; i < pInfo.Length; i++)
反射(Reflection)的性能分析反射(Reflection)的性能分析                                
{
反射(Reflection)的性能分析                                    
if (Args[i] != null && pInfo[i].ParameterType != typeof(object)
反射(Reflection)的性能分析                                        
&& pInfo[i].ParameterType != typeof(object[]))
反射(Reflection)的性能分析反射(Reflection)的性能分析                                    
{
反射(Reflection)的性能分析                                        
if (pInfo[i].ParameterType != Args[i].GetType())
反射(Reflection)的性能分析反射(Reflection)的性能分析                                        
{
反射(Reflection)的性能分析                                            same 
= false;
反射(Reflection)的性能分析                                        }

反射(Reflection)的性能分析                                    }

反射(Reflection)的性能分析                                }

反射(Reflection)的性能分析                                
if (same)
反射(Reflection)的性能分析反射(Reflection)的性能分析                                
{
反射(Reflection)的性能分析                                    HereType 
= t;
反射(Reflection)的性能分析                                    method 
= mInfo;
反射(Reflection)的性能分析                                }

反射(Reflection)的性能分析                            }

反射(Reflection)的性能分析                        }

反射(Reflection)的性能分析
反射(Reflection)的性能分析                        
if (method != null)
反射(Reflection)的性能分析反射(Reflection)的性能分析                        
{
反射(Reflection)的性能分析                            
break;
反射(Reflection)的性能分析                        }

反射(Reflection)的性能分析                    }

反射(Reflection)的性能分析
反射(Reflection)的性能分析                    
if (method != null)
反射(Reflection)的性能分析反射(Reflection)的性能分析                    
{
反射(Reflection)的性能分析                        
break;
反射(Reflection)的性能分析                    }

反射(Reflection)的性能分析                }

反射(Reflection)的性能分析
反射(Reflection)的性能分析                
if (method != null)
反射(Reflection)的性能分析反射(Reflection)的性能分析                
{
反射(Reflection)的性能分析                    
break;
反射(Reflection)的性能分析                }

反射(Reflection)的性能分析            }

反射(Reflection)的性能分析
反射(Reflection)的性能分析            
if (method == null)
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                
//Log.LogException(typeof(Excute), "没有发现:" + FileName + "/" + MethodName, new Exception("没有发现:" + FileName + "/" + MethodName));
反射(Reflection)的性能分析
                return null;
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析
反射(Reflection)的性能分析            
object ins = null;
反射(Reflection)的性能分析            
if (!method.IsStatic)
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                ins 
= a.CreateInstance(HereType.FullName);
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析            
object RetObject = method.Invoke(ins, Args);
反射(Reflection)的性能分析            
return RetObject;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析    
反射(Reflection)的性能分析
反射(Reflection)的性能分析        
private string test5()
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            
int now = System.Environment.TickCount;
反射(Reflection)的性能分析            
for (int i = 0; i < 1000; i++)
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                
for (int j = 0; j < 100; j++)
反射(Reflection)的性能分析反射(Reflection)的性能分析                
{
反射(Reflection)的性能分析反射(Reflection)的性能分析                    InvokeMehod(
@"D:\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2\bin\Debug\ClassLibrary1.dll""test1"new object[] { });
反射(Reflection)的性能分析                }

反射(Reflection)的性能分析            }

反射(Reflection)的性能分析
反射(Reflection)的性能分析            
string time = (System.Environment.TickCount - now).ToString();
反射(Reflection)的性能分析            
return time;
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析        
static void Main(string[] args)
反射(Reflection)的性能分析反射(Reflection)的性能分析        
{
反射(Reflection)的性能分析            Program p 
= new Program();
反射(Reflection)的性能分析            
string ticks = p.test1();
反射(Reflection)的性能分析            Console.WriteLine(
"用编译器执行:"+ticks);
反射(Reflection)的性能分析            
string t = p.test2();
反射(Reflection)的性能分析            Console.WriteLine(
"用反射执行"+t);
反射(Reflection)的性能分析            
string t1 = p.test3();
反射(Reflection)的性能分析            Console.WriteLine(
"优化之后的反射:"+t1);
反射(Reflection)的性能分析            
string t2 = p.test5();
反射(Reflection)的性能分析            Console.WriteLine(
"加载程序集并反射:"+t2);
反射(Reflection)的性能分析            
if (ticks.ToString() == "0")
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                Console.WriteLine(
"反射/编译: 不在一个级别上面");
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析            
else
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                Console.WriteLine(
"反射/编译 =" + (Convert.ToInt32(t) / Convert.ToInt32(ticks)).ToString());
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析     
反射(Reflection)的性能分析            
if (ticks.ToString() == "0")
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                Console.WriteLine(
"加载程序集并反射/编译: 不在一个级别上面");
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析            
else
反射(Reflection)的性能分析反射(Reflection)的性能分析            
{
反射(Reflection)的性能分析                Console.WriteLine(
"加载程序集并反射/编译 =" + (Convert.ToInt32(t2) / Convert.ToInt32(ticks)).ToString());
反射(Reflection)的性能分析            }

反射(Reflection)的性能分析           
反射(Reflection)的性能分析
反射(Reflection)的性能分析            Console.WriteLine(
"加载程序集并反射/反射 =" + (Convert.ToInt32(t2) / Convert.ToInt32(t)).ToString());
反射(Reflection)的性能分析           
反射(Reflection)的性能分析            Console.Read();
反射(Reflection)的性能分析        }

反射(Reflection)的性能分析    }

反射(Reflection)的性能分析}

反射(Reflection)的性能分析

测试结果为:

638倍的性能损失,不知道算大算小,反正项目经理说无所谓。
赫赫,无(。。)者无畏