参考了微软的realproxy设计模式,使用相同的IMessage结构,重写了整个proxy。

使用了emit技术,性能得到了极大提升。

模仿旧的pojo代码,得到:

代码

    class MyProxy<T> : DynamicProxy
    {
        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;}
    }

测试代码如下:

代码

        //performance
        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并不弱!导致我无法提升一个数量级)...相关推荐

  1. 用群体测试开发成功的应用程序

    为什么80%的码农都做不了架构师?>>>    ‍ Jan Wolter是testhub公司的CEO和共同创始人.他负责财务,战略和业务发展.2011年他从伦敦政治经济学院以优异的成 ...

  2. 优秀程序员的开发效率是普通程序员的 10 倍,那么如何提升呢?

    1975 年,弗雷德里克·布鲁克斯(Frederick Brooks)出版了软件行业的名著<人月神话>,他给出了一个统计结果,优秀程序员的开发效率是普通程序员的 10 倍.40 多年过去了 ...

  3. 【开源分享】自制STC15W408AS开发板

    [开源分享]自制STC15W408AS开发板 实物图: 和Arduino UNO板子尺寸差不多 开源平台:立创EDA 立创eda主页链接:https://oshwhub.com/perseveranc ...

  4. PROFINET I/O设备初步开发成功发帖庆贺一下

    经过将近3个月的奋战,PROFINET I/O设备初步开发成功发帖庆贺一下. 一.PLC挂接分布式机架模块(该分布式机架目前挂接了7个模块) 二.单片机程序 三.GSDML文件

  5. Internal error: Oops: 37 [#1] PREEMPT SMP ARM。处理方法果然touchscreens被编译了,但是我的触摸屏没有接,取消此编译选项,重新编译,开发成功启动

    linux kernel version: 4.4.38 hardware : exynos4412-tiny4412 起因:我向调试开发板上的网络设备驱动,需要更新kernel,更新后发现开发板无法 ...

  6. 00后南航大二学生自制火箭,成功发射后回收

    ‍ ‍还记得去年8月火了的自制火箭的00后南航大学生吗?他近日做出来自制火箭第二代了! B站up主@Lshang001 在10月9日发布了最新的视频,标题为<[硬核]小型反推垂直回收火箭研发制造 ...

  7. signature=6f1ae6ad5c67016da86cc9325f33f066,中国石油自主聚丙烯熔喷专用料开发成功

    86 石油化工应用 2020年 第39卷 测腔)容积,体积偏差平均约0.22 %,计算精度较高 (见表2). 4 结论与认识 (1) 溶腔过程中,注入水并不全部参与腔体的溶蚀 过程.其中滞留水将留在腔 ...

  8. 如何开发成功的旅游应用,例如Priceline,Expedia和Airbnb

    by Dmytro Brovkin 由Dmytro Brovkin 如何开发成功的旅游应用,例如Priceline,Expedia和Airbnb (How To Develop a Successfu ...

  9. 《MySQL开发规范》过时了,视图的查询性能提升了一万倍

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

最新文章

  1. Linux下SVN服务器支持Apache的http和svnserve独立服务器
  2. 解决删除U盘时提示无法停止‘通用卷’设备的方法
  3. java main 参数传递参数_Java千问:Java语言如何给main方法传递参数?
  4. android dialog 结构,Android 原生Dialog实现
  5. koa --- 使用Sequelize连接mysql
  6. Android 闹钟
  7. 考研过程中最容易犯的八大错误
  8. XLSTransformer生成excel文件
  9. (池州市地图)行政区划图高清矢量cdr|pdf(详细版2021年)
  10. 通识3——1080i、1080p、2K、4K是什么意思?
  11. 表示自己从头开始的句子_表示一切从头开始的唯美句子38条
  12. css文本行高是哪个属性_css属性行高line-height的用法详解
  13. 第九周项目5 三色球
  14. RC滤波 电阻电容的损耗计算方法
  15. Shell bash和sh区别
  16. 初中数学分几个模块_初中数学主要分几大板块,该注意学习哪个板块?
  17. Lock wait timeout exceeded; try restarting transaction解决
  18. JAVA中边长的英文,JAVA的一部分术语中英文对照(
  19. 无人机三维实景模型的应用和发展
  20. 计算机台式机快捷键开机,电脑快捷键如何快速开关机

热门文章

  1. 【react+umi】国际化配置:浏览器默认英文,如何让工程默认语言为中文?
  2. PC端支付——微信支付与支付宝支付
  3. 使用Node.js express 开发上传文件/图片api接口
  4. TP-Link ER系列路由器下挂路由器设置VLAN方法
  5. 素数判断 isPrime
  6. 【Android -- SDK】高德地图的使用
  7. Sketch Nyquist plot 徒手绘制Nyquist 曲线
  8. TCL65V2智能电视机质量怎么样是4K屏幕吗,不要被骗了
  9. python round_Python round() 函数
  10. Opencv中的ROI介绍