zoukankan      html  css  js  c++  java
  • DynamicProxy性能简单测试

    写被代理类
    public interface ITest
    {
        string GetStr(int i);
    }
    
    public class Test:ITest
    {
        public string GetStr(int i)
        {
            return i.ToString();
        }
    }

    此类的方式基本是什么也不做,直接返回的。

    写切入方法

    public class Aop1 : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            invocation.Proceed();
        }
        public void dosomthing()
        {
        }
    }

    此切入方法也基本是什么也不做的。

    1百万次调用

    var proxy = pg.CreateInterfaceProxyWithTarget<ITest>(new Test(), new Aop1());
    var r = proxy.GetStr(1);
    var x=new Aop1();
    x.dosomthing();
    var r = new Test().GetStr(1);

    对比。

    因为生成代理类的过程里有new Test()和new Aop1()的过程,为了避免因为这个引起的差异,在直接执行时,也new了Aop1,并且执行了一个空方法。

    结果

    image

    使用动态代理比直接调用慢35倍以上。

    生成代理耗时非常长,单不仅仅是生成代理慢,生成并调用的时间-只生成不调用的时间=调用生成好的时间,此时间仍然是直接调用的10倍

    但是如果把Create….这句放到循环外,也就是只生成一个代理,每次调用都用这同一个代理,则

    image

    仅2倍多点。

    如果仅生成一次代理,相当于代理是单例,这样是否会有并发问题尚未测试。

    但是从挂上ioc的角度考虑,一个实际类中有若干个方法,每个方法有不同的aop需要,那在执行的时候应该是为不同的方法生成不同的代理。只生成一个代理似乎走不通。

    无论如何,这个性能差异让我望而生畏

  • 相关阅读:
    fusioncompute安装虚拟机的问题---如何扩容至5T 和 挂载Tools的解决方式
    接口请求返回状态码总结
    【内推】字节跳动
    RPA行业见解(一)
    消息中间件(一)MQ详解及四大MQ比较
    Springcloud学习
    常用加密算法
    Java实现token的生成与验证
    linux 系统下安装和卸载Node.js
    Linux安装Mysql
  • 原文地址:https://www.cnblogs.com/czcz1024/p/3121591.html
Copyright © 2011-2022 走看看