自制DynamicProxy开发成功,性能测试提升了1.4倍。(看来微软的realproxy并不弱!导致我无法提升一个数量级)...
参考了微软的realproxy设计模式,使用相同的IMessage结构,重写了整个proxy。
使用了emit技术,性能得到了极大提升。
模仿旧的pojo代码,得到:
![](/assets/blank.gif)
![](/assets/blank.gif)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
public MyProxy()
: base(typeof(T))
{
}
public T Value
{
get
{
return (T)base.GetTransparentProxy();
}
}
public override IDynamicMethodReturnMessage Invoke(IDynamicMethodCallMessage msg)
{
string methodname = msg.MethodInfo.Name.Trim().ToUpper();
if (methodname.StartsWith("GET_"))
return InvokeGetter(msg);
if (methodname.StartsWith("SET_"))
return InvokeSetter(msg);
return base.CreateReturnMessage(new Exception("only support property."), msg);
}
private IDynamicMethodReturnMessage InvokeGetter(IDynamicMethodCallMessage methodCall)
{
IDummyMethodInfo method = methodCall.MethodInfo;
string invokeid = GetInvokeMessageId(method);
if (dict.ContainsKey(invokeid))
{
return base.CreateReturnMessage(dict[invokeid], methodCall);
}
if (method.ReturnType.PropertyType == DotNetPropertyType.Enum)
{
return base.CreateReturnMessage(0, methodCall);
}
switch (Pixysoft.Tools.ParserHelper.GetDataTypeByTypeName(method.ReturnType.Name))
{
case DotNetDataType.Boolean:
{
return base.CreateReturnMessage(false, methodCall);
}
case DotNetDataType.Byte:
{
return base.CreateReturnMessage(byte.MinValue, methodCall);
}
case DotNetDataType.Char:
{
return base.CreateReturnMessage(char.MinValue, methodCall);
}
case DotNetDataType.DateTime:
{
return base.CreateReturnMessage(DateTime.MinValue, methodCall);
}
case DotNetDataType.Decimal:
{
return base.CreateReturnMessage(decimal.MinValue, methodCall);
}
case DotNetDataType.Double:
{
return base.CreateReturnMessage(double.MinValue, methodCall);
}
case DotNetDataType.Int32:
{
return base.CreateReturnMessage(int.MinValue, methodCall);
}
case DotNetDataType.Int64:
{
return base.CreateReturnMessage(Int32.MinValue, methodCall);
}
case DotNetDataType.Single:
{
return base.CreateReturnMessage(Single.MinValue, methodCall);
}
case DotNetDataType.String:
case DotNetDataType.UNKNOWN:
default:
{
return base.CreateReturnMessage(null, methodCall);
}
}
}
private IDynamicMethodReturnMessage InvokeSetter(IDynamicMethodCallMessage methodCall)
{
if (methodCall.InArgCount == 0)
return base.CreateReturnMessage(null, methodCall);
string invokeid = GetInvokeMessageId(methodCall.MethodInfo);
if (dict.ContainsKey(invokeid))
dict.Remove(invokeid);
dict.Add(invokeid, methodCall.InArgs[0]);
return base.CreateReturnMessage(null, methodCall);
}
private string GetInvokeMessageId(IDummyMethodInfo method)
{
StringBuilder builder = new StringBuilder();
builder.Append(method.Name.Substring(4));
builder.Append(method.DeclaringType.FullName);
//return builder.ToString();
return Pixysoft.Security.MD5.GetMD5(builder.ToString());
}
}
public interface IproxyWithProperty
{
string Name { set;get;}
}
测试代码如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
public void test002()
{
IproxyWithProperty pojo = Pixysoft.Tools.PojoHelper.GetPojo<IproxyWithProperty>();
IproxyWithProperty proxy = new MyProxy<IproxyWithProperty>().Value;
Pixysoft.Tools.CodeTimer.Initialize();
Pixysoft.Tools.CodeTimer.Time("pojo", 100000, delegate()
{
pojo.Name = "123";
object name = pojo.Name;
});
Pixysoft.Tools.CodeTimer.Time("proxy", 100000, delegate()
{
proxy.Name = "123";
object name = proxy.Name;
});
}
测试结果如下:
------ Test started: Assembly: Pixysoft.Framework.Reflection.dll ------
pojo
Time Elapsed: 7,997ms
CPU time: 7,796,875,000ns
Gen 0: 760
Gen 1: 0
Gen 2: 0
proxy
Time Elapsed: 5,651ms
CPU time: 5,484,375,000ns
Gen 0: 398
Gen 1: 0
Gen 2: 0
1 passed, 0 failed, 0 skipped, took 13.77 seconds (Ad hoc).
性能提高了1.415倍。
如果把初始化proxy的代码放入循环,得到结果:
------ Test started: Assembly: Pixysoft.Framework.Reflection.dll ------
pojo
Time Elapsed: 8,569ms
CPU time: 8,015,625,000ns
Gen 0: 800
Gen 1: 0
Gen 2: 0
proxy
Time Elapsed: 6,263ms
CPU time: 5,843,750,000ns
Gen 0: 475
Gen 1: 0
Gen 2: 0
性能提高了1.368倍。
可以看出,微软的Realproxy本质上并不弱。 内部实现应该使用了类似emit的技术了。。。
因此,一天的努力几乎有点白费了。。。竟然没有提高一个数量级。。。
1 passed, 0 failed, 0 skipped, took 14.92 seconds (Ad hoc).
转载于:https://www.cnblogs.com/zc22/archive/2010/06/05/1751974.html
自制DynamicProxy开发成功,性能测试提升了1.4倍。(看来微软的realproxy并不弱!导致我无法提升一个数量级)...相关推荐
- 用群体测试开发成功的应用程序
为什么80%的码农都做不了架构师?>>> Jan Wolter是testhub公司的CEO和共同创始人.他负责财务,战略和业务发展.2011年他从伦敦政治经济学院以优异的成 ...
- 优秀程序员的开发效率是普通程序员的 10 倍,那么如何提升呢?
1975 年,弗雷德里克·布鲁克斯(Frederick Brooks)出版了软件行业的名著<人月神话>,他给出了一个统计结果,优秀程序员的开发效率是普通程序员的 10 倍.40 多年过去了 ...
- 【开源分享】自制STC15W408AS开发板
[开源分享]自制STC15W408AS开发板 实物图: 和Arduino UNO板子尺寸差不多 开源平台:立创EDA 立创eda主页链接:https://oshwhub.com/perseveranc ...
- PROFINET I/O设备初步开发成功发帖庆贺一下
经过将近3个月的奋战,PROFINET I/O设备初步开发成功发帖庆贺一下. 一.PLC挂接分布式机架模块(该分布式机架目前挂接了7个模块) 二.单片机程序 三.GSDML文件
- Internal error: Oops: 37 [#1] PREEMPT SMP ARM。处理方法果然touchscreens被编译了,但是我的触摸屏没有接,取消此编译选项,重新编译,开发成功启动
linux kernel version: 4.4.38 hardware : exynos4412-tiny4412 起因:我向调试开发板上的网络设备驱动,需要更新kernel,更新后发现开发板无法 ...
- 00后南航大二学生自制火箭,成功发射后回收
还记得去年8月火了的自制火箭的00后南航大学生吗?他近日做出来自制火箭第二代了! B站up主@Lshang001 在10月9日发布了最新的视频,标题为<[硬核]小型反推垂直回收火箭研发制造 ...
- signature=6f1ae6ad5c67016da86cc9325f33f066,中国石油自主聚丙烯熔喷专用料开发成功
86 石油化工应用 2020年 第39卷 测腔)容积,体积偏差平均约0.22 %,计算精度较高 (见表2). 4 结论与认识 (1) 溶腔过程中,注入水并不全部参与腔体的溶蚀 过程.其中滞留水将留在腔 ...
- 如何开发成功的旅游应用,例如Priceline,Expedia和Airbnb
by Dmytro Brovkin 由Dmytro Brovkin 如何开发成功的旅游应用,例如Priceline,Expedia和Airbnb (How To Develop a Successfu ...
- 《MySQL开发规范》过时了,视图的查询性能提升了一万倍
MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...
最新文章
- Linux下SVN服务器支持Apache的http和svnserve独立服务器
- 解决删除U盘时提示无法停止‘通用卷’设备的方法
- java main 参数传递参数_Java千问:Java语言如何给main方法传递参数?
- android dialog 结构,Android 原生Dialog实现
- koa --- 使用Sequelize连接mysql
- Android 闹钟
- 考研过程中最容易犯的八大错误
- XLSTransformer生成excel文件
- (池州市地图)行政区划图高清矢量cdr|pdf(详细版2021年)
- 通识3——1080i、1080p、2K、4K是什么意思?
- 表示自己从头开始的句子_表示一切从头开始的唯美句子38条
- css文本行高是哪个属性_css属性行高line-height的用法详解
- 第九周项目5 三色球
- RC滤波 电阻电容的损耗计算方法
- Shell bash和sh区别
- 初中数学分几个模块_初中数学主要分几大板块,该注意学习哪个板块?
- Lock wait timeout exceeded; try restarting transaction解决
- JAVA中边长的英文,JAVA的一部分术语中英文对照(
- 无人机三维实景模型的应用和发展
- 计算机台式机快捷键开机,电脑快捷键如何快速开关机