为什么InterfaceInterceptor不比TransparentProxyInterceptor快?

时间:2012-01-29 22:46:14

标签: c# unity-container

我有一个简单的界面及其实现:

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特别says,InterfaceInterceptor比TransparentProxyInterceptor快得多。

1 个答案:

答案 0 :(得分:1)

我建议您在拨打Sum()之前和之后测量呼叫处理程序之外的时间。除此之外:10.000蜱是1ms。我不希望在如此短的时间内进行准确的测量。