写被代理类
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,并且执行了一个空方法。
结果
使用动态代理比直接调用慢35倍以上。
生成代理耗时非常长,单不仅仅是生成代理慢,生成并调用的时间-只生成不调用的时间=调用生成好的时间,此时间仍然是直接调用的10倍
但是如果把Create….这句放到循环外,也就是只生成一个代理,每次调用都用这同一个代理,则
仅2倍多点。
如果仅生成一次代理,相当于代理是单例,这样是否会有并发问题尚未测试。
但是从挂上ioc的角度考虑,一个实际类中有若干个方法,每个方法有不同的aop需要,那在执行的时候应该是为不同的方法生成不同的代理。只生成一个代理似乎走不通。
无论如何,这个性能差异让我望而生畏