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需要,那在执行的时候应该是为不同的方法生成不同的代理。只生成一个代理似乎走不通。

 

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

你可能感兴趣的:(dynamic)