为什么InterfaceInterceptor不比TransparentProxyInterceptor快
本文关键字:TransparentProxyInterceptor 不比 InterfaceInterceptor 为什么 | 更新日期: 2023-09-27 18:22:02
我有一个简单的接口及其实现:
public interface ICalculator
{
long Sum(int ceiling);
}
public class Calculator : ICalculator
{
public long Sum(int ceiling)
{
long sum = 0;
for (long i = 1; i <= ceiling; i++)
{
sum += i;
}
return sum;
}
}
测量计算时间的调用处理程序:
public class MyCallHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var result = getNext()(input, getNext);
stopwatch.Stop();
Trace.WriteLine(stopwatch.ElapsedTicks, "Benchmark");
return result;
}
public int Order { get; set; }
}
Unity容器设置如下:
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<ICalculator, Calculator>();
unityContainer.AddNewExtension<Interception>();
unityContainer.Configure<Interception>().AddPolicy("MyPolicy")
.AddMatchingRule(new MemberNameMatchingRule("Sum"))
.AddCallHandler<MyCallHandler>();
unityContainer.Configure<Interception>().SetInterceptorFor<ICalculator>(new TransparentProxyInterceptor());
当我调用unityContainer.Resolve<ICalculator>().Sum(80000)
时,TransparentProxyInterceptor会得到~2100个刻度,InterfaceInterceptor则会得到~5500个刻度
当计算数百万的总和时,拦截器具有几乎相同的性能,尽管MSDN特别指出InterfaceInterceptor比TransparentProxyInterceptor快得多。
我建议在调用Sum()
之前和之后测量调用处理程序之外的时间。除此之外:10000个刻度是1ms。我不希望在这么短的时间内进行准确的测量。