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

 

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

posted @ 2013-06-06 17:09  czcz1024  阅读(279)  评论(0编辑  收藏  举报