http://www.iloveyou10000.com
新blogs地址 http://itares.cnblogs.com
博客园
首页
新随笔
联系
订阅
管理
127 Posts :: 14 Stories :: 75 Comments :: 1 Trackbacks
公告
从设计模式开始
执著软件架构
山阻石拦大江毕竟东流去
雪辱霜欺梅花依旧向阳开
昵称:
fanrsh
园龄:
6年8个月
粉丝:
1
关注:
0
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
最新随笔
1. Javascript's Event 的一点总结
2. [转]SQL Server2005 SQLCLR代码安全之权限(3)
3. [转]SQL Server2005 SQLCLR代码安全之权限(2)
4. [转]SQL Server2005 SQLCLR代码安全之权限(1)
5. Remoting事件序列一:客户端触发服务器端事件
6. jquery入门1:简单收缩菜单
7. jQuery工作原理解析以及源代码示例
8. ASP.NET 页面生存周期概览
9. 推荐一个快速反射调用的类
10. Visual Studio 2005的版本情况和新特征详细介绍
随笔分类
.Net Remoting(3)
.NET1.1(45)
.NET2.0(16)
ajax(3)
c/c++(1)
CodeSmith(1)
Enterprise Library(1)
javascript(10)
ReportViewer(1)
socket(2)
SQLCLR(3)
SSL(4)
webservices(3)
xml(5)
存储过程(3)
多线程探索(1)
开源项目研究(2)
控件研究(2)
设计模式
数据库技术(12)
网络相关(2)
正则表达示(5)
随笔档案
2007年12月 (1)
2007年10月 (3)
2007年9月 (3)
2007年8月 (10)
2007年7月 (1)
2007年6月 (4)
2007年5月 (3)
2007年4月 (6)
2007年3月 (1)
2006年12月 (2)
2006年11月 (2)
2006年9月 (7)
2006年8月 (6)
2006年7月 (15)
2006年6月 (52)
2006年5月 (9)
2005年11月 (2)
文章分类
AspNetForums(1)
Community Server
IT新闻(9)
LoadRunner (1)
PetShop(1)
非技术文章(1)
个人简历
文章档案
2007年5月 (1)
2006年9月 (2)
2006年8月 (6)
2006年7月 (1)
2006年6月 (3)
2006年5月 (1)
相册
我的照片
顶尖高手专题报道
asp.net官方学习站
ASP.NET入门随想 - 老燕
Bruce Zhang(设计之道)
Dflying Chen(Atlas)
DOTNET控件网
MSDN--Webcast
MSDN讲师(苏鹏)
Rickie(Remoting技术)
SQLCLR系列文章
uGoer(CommunityServer)
wayfarer(aop)
关于ADO.Net连接池
李天平(.Net代码自动生成器)
吕震宇(C#设计模式)
数据结构
思归呓语
谭振林(绝对的牛人)
网络安全
小山(设计模式)
中国协议分析网
好友blogs
ajax+lucene
csdn曾登高
Roading
宝玉的blog
博客堂
芳哥
老孟
李云飞
破宝
数据库专家(邹建)
雨痕工作室
开源项目推荐
DotLucene
open-source search engine for .NET
http://extjs.com
javascript扩展
miniajax
一些不错的ajax应用
开源项目集合
积分与排名
积分 - 53220
排名 - 1983
最新评论
阅读排行榜
评论排行榜
推荐排行榜
推荐一个快速反射调用的类
使用传统的.net反射机制,调用类的方法时,在调用频率大的情况下,会感觉速度很慢。最近浏览
卢彦
的博客时,找到一个他改进后的反射调用类。试用以后感觉效率明显提高,特推荐给大家。作者重新实现了,反射调用方法,但是调用接口和.net原有方法一致。而且调用时抛出的异常为所调用类的实际异常,不像传统方式返回为包装异常。
文章来源:
http://www.codeproject.com/csharp/FastMethodInvoker.asp
快速反射调用类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Reflection;
using
System.Reflection.Emit;
namespace
FastMethodInvoker
{
class
FastInvoke
{
public
delegate
object
FastInvokeHandler(
object
target,
object
[] paramters);
static
object
InvokeMethod(FastInvokeHandler invoke,
object
target,
params
object
[] paramters)
{
return
invoke(
null
, paramters);
}
public
static
FastInvokeHandler GetMethodInvoker(MethodInfo methodInfo)
{
DynamicMethod dynamicMethod
=
new
DynamicMethod(
string
.Empty,
typeof
(
object
),
new
Type[]
{
typeof
(
object
),
typeof
(
object
[]) }
, methodInfo.DeclaringType.Module);
ILGenerator il
=
dynamicMethod.GetILGenerator();
ParameterInfo[] ps
=
methodInfo.GetParameters();
Type[] paramTypes
=
new
Type[ps.Length];
for
(
int
i
=
0
; i
<
paramTypes.Length; i
++
)
{
if
(ps[i].ParameterType.IsByRef)
paramTypes[i]
=
ps[i].ParameterType.GetElementType();
else
paramTypes[i]
=
ps[i].ParameterType;
}
LocalBuilder[] locals
=
new
LocalBuilder[paramTypes.Length];
for
(
int
i
=
0
; i
<
paramTypes.Length; i
++
)
{
locals[i]
=
il.DeclareLocal(paramTypes[i],
true
);
}
for
(
int
i
=
0
; i
<
paramTypes.Length; i
++
)
{
il.Emit(OpCodes.Ldarg_1);
EmitFastInt(il, i);
il.Emit(OpCodes.Ldelem_Ref);
EmitCastToReference(il, paramTypes[i]);
il.Emit(OpCodes.Stloc, locals[i]);
}
if
(
!
methodInfo.IsStatic)
{
il.Emit(OpCodes.Ldarg_0);
}
for
(
int
i
=
0
; i
<
paramTypes.Length; i
++
)
{
if
(ps[i].ParameterType.IsByRef)
il.Emit(OpCodes.Ldloca_S, locals[i]);
else
il.Emit(OpCodes.Ldloc, locals[i]);
}
if
(methodInfo.IsStatic)
il.EmitCall(OpCodes.Call, methodInfo,
null
);
else
il.EmitCall(OpCodes.Callvirt, methodInfo,
null
);
if
(methodInfo.ReturnType
==
typeof
(
void
))
il.Emit(OpCodes.Ldnull);
else
EmitBoxIfNeeded(il, methodInfo.ReturnType);
for
(
int
i
=
0
; i
<
paramTypes.Length; i
++
)
{
if
(ps[i].ParameterType.IsByRef)
{
il.Emit(OpCodes.Ldarg_1);
EmitFastInt(il, i);
il.Emit(OpCodes.Ldloc, locals[i]);
if
(locals[i].LocalType.IsValueType)
il.Emit(OpCodes.Box, locals[i].LocalType);
il.Emit(OpCodes.Stelem_Ref);
}
}
il.Emit(OpCodes.Ret);
FastInvokeHandler invoder
=
(FastInvokeHandler)dynamicMethod.CreateDelegate(
typeof
(FastInvokeHandler));
return
invoder;
}
private
static
void
EmitCastToReference(ILGenerator il, System.Type type)
{
if
(type.IsValueType)
{
il.Emit(OpCodes.Unbox_Any, type);
}
else
{
il.Emit(OpCodes.Castclass, type);
}
}
private
static
void
EmitBoxIfNeeded(ILGenerator il, System.Type type)
{
if
(type.IsValueType)
{
il.Emit(OpCodes.Box, type);
}
}
private
static
void
EmitFastInt(ILGenerator il,
int
value)
{
switch
(value)
{
case
-
1
:
il.Emit(OpCodes.Ldc_I4_M1);
return
;
case
0
:
il.Emit(OpCodes.Ldc_I4_0);
return
;
case
1
:
il.Emit(OpCodes.Ldc_I4_1);
return
;
case
2
:
il.Emit(OpCodes.Ldc_I4_2);
return
;
case
3
:
il.Emit(OpCodes.Ldc_I4_3);
return
;
case
4
:
il.Emit(OpCodes.Ldc_I4_4);
return
;
case
5
:
il.Emit(OpCodes.Ldc_I4_5);
return
;
case
6
:
il.Emit(OpCodes.Ldc_I4_6);
return
;
case
7
:
il.Emit(OpCodes.Ldc_I4_7);
return
;
case
8
:
il.Emit(OpCodes.Ldc_I4_8);
return
;
}
if
(value
>
-
129
&&
value
<
128
)
{
il.Emit(OpCodes.Ldc_I4_S, (SByte)value);
}
else
{
il.Emit(OpCodes.Ldc_I4, value);
}
}
}
}
效果测试程序
using
System;
using
System.Reflection;
using
System.Reflection.Emit;
using
System.Collections.Generic;
using
System.Text;
using
System.Diagnostics;
namespace
FastMethodInvoker
{
class
Program
{
static
void
Main(
string
[] args)
{
Type t
=
typeof
(Person);
MethodInfo methodInfo
=
t.GetMethod(
"
Say
"
);
Person person
=
new
Person();
string
word
=
"
hello
"
;
Person p
=
null
;
object
[] param
=
new
object
[]
{ word, p,
3
}
;
int
TestTimes
=
100000
;
//
测试次数,可自行调节看效果
传统方式反射
#region
传统方式反射
try
{
Stopwatch watch
=
new
Stopwatch();
watch.Start();
for
(
int
i
=
0
; i
<
TestTimes; i
++
)
{
methodInfo.Invoke(person, param);
}
watch.Stop();
Console.WriteLine(TestTimes.ToString()
+
"
times invoked by Reflection:
"
+
watch.ElapsedMilliseconds
+
"
ms
"
);
}
catch
(System.Exception ex)
{
Console.WriteLine(
"
传统方式反射 直接错误:
"
+
ex.Message);
Console.WriteLine(
"
传统方式反射 内部错误:
"
+
ex.InnerException.Message);
}
#endregion
快速反射
#region
快速反射
try
{
Stopwatch watch1
=
new
Stopwatch();
FastInvoke.FastInvokeHandler fastInvoker
=
FastInvoke.GetMethodInvoker(methodInfo);
watch1.Start();
for
(
int
i
=
0
; i
<
TestTimes; i
++
)
{
fastInvoker(person, param);
}
watch1.Stop();
Console.WriteLine(TestTimes.ToString()
+
"
times invoked by FastInvoke:
"
+
watch1.ElapsedMilliseconds
+
"
ms
"
);
}
catch
(System.Exception ex)
{
Console.WriteLine(
"
快速反射 错误:
"
+
ex.Message);
}
#endregion
直接调用
#region
直接调用
try
{
Stopwatch watch2
=
new
Stopwatch();
watch2.Start();
for
(
int
i
=
0
; i
<
TestTimes; i
++
)
{
person.Say(
ref
word,
out
p,
3
);
}
watch2.Stop();
Console.WriteLine(TestTimes.ToString()
+
"
times invoked by DirectCall:
"
+
watch2.ElapsedMilliseconds
+
"
ms
"
);
}
catch
(System.Exception ex)
{
Console.WriteLine(
"
直接调用 错误:
"
+
ex.Message);
}
#endregion
Console.ReadLine();
}
}
public
class
Person
{
public
void
Say(
ref
string
word,
out
Person p,
int
avi)
{
word
=
"
ttt
"
+
avi.ToString();
p
=
new
Person();
//
throw new System.Exception("出错了哦");
}
}
}
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2007-08-28 09:58
fanrsh
阅读(251)
评论(0)
编辑
收藏
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
iPhone 5四大猜想:泪珠状 带LED苹果标识
·
当当网Q4整体亏损1.3亿元 上年同期净利润1480万元
·
把孩子培养成为合格Geek的七个方法
·
担心网购的衣服不合身? 创业公司Clothes Horse用“问答”就能解决你的难题
·
评价社交媒体活动ROI的三个精确指标
»
更多新闻...
最新知识库文章
:
·
编程的艺术:漂亮的代码和漂亮的软件
·
GIT分支管理是一门艺术
·
编程:是一门艺术
·
编程是一门艺术吗?
·
对Java初学者的忠告
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
Powered by:
博客园
Copyright © fanrsh