Производительность компиляции выражения

#c# #generics #func

#c# #общие положения #функция

Вопрос:

У меня есть следующий метод, и мне интересно узнать о влиянии компиляции выражения на производительность.

     public async Task<Response<TResult>> Execute<TApi, TResult>(Expression<Func<TApi, Task<TResult>>> executeApiMethod)
    { 
        try
        {
            var responseData = await executeApiMethod.Compile()(restApi).ConfigureAwait(false);
            return new Response<TResult>(responseData);
        }
        catch (ApiException refitApiException)
        {


            throw;
        }
    }
  

Есть ли способ лучше? Есть ли какое-либо влияние на производительность compile() , поскольку это является общим и может вызываться с разными аргументами каждый раз, когда выполняется компиляция, является неполадкой.

Комментарии:

1. Я бы ожидал, что это, по крайней мере частично, будет зависеть от выражений, которые вы компилируете. Вполне разумно опасаться этого, но правильным следующим шагом будет измерить влияние на производительность. Мы недостаточно знаем о вашем приложении, чтобы знать, что было бы разумно, а что было бы слишком высоким, или есть ли возможности кэширования и т.д.

2. @JonSkeet мой вариант использования — перенос вызовов api для обработки ситуаций с ошибками. ie: clienthandler.execute(a=>a.GetSomething(), myApiContract) чтобы мне не приходилось везде повторять один и тот же код.

3. Почему вы используете для этого деревья выражений вместо обычного делегата? (Я предполагаю, что ваш код обработки ошибок на самом деле более сложный — просто перехват и повторное перемещение бессмысленны.)

4. @JonSkeet Я удалил код для краткости. Вы имеете в виду, что я должен использовать Func вместо Expression?

5. Ну, это, конечно, выглядит так, как будто вы могли бы просто использовать Func , да.