Почему InterfaceInterceptor не быстрее, чем TransparentProxyInterceptor? - PullRequest
1 голос
/ 30 января 2012

У меня простой интерфейс и его реализация:

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), я получаю ~ 2100 тиков для TransparentProxyInterceptor и ~ 5500 тиков для InterfaceInterceptor.
Когда вычисляется сумма в миллионах, перехватчики имеют почти одинаковую производительность, хотя MSDN, в частности, говорит , что InterfaceInterceptor намного быстрее, чем TransparentProxyInterceptor.

1 Ответ

1 голос
/ 30 января 2012

Я бы порекомендовал измерить время за пределами вашего обработчика вызовов непосредственно до и после того, как вы позвоните Sum(). Кроме того: 10.000 тиков - это 1мс. Я не ожидал бы точных измерений для таких коротких периодов времени.

...