В процессе оптимизации вызовов отражения я экспериментирую с использованием Delegate.CreateDelegate
и LambdaExpression.Compile
чтобы превратить мои MethodInfo
в более быстрых делегатов.
Основываясь на этом вопросе, я ожидал, что LambdaExpression.Compile
будет работать значительно лучше, потому что он будет генерировать фактический MSIL для вызова метода — что-то близкое к прямому вызову метода.
Однако после бенчмаркинга я заметил, что оба метода имеют примерно одинаковую производительность.
Моя гипотеза заключается в том, что накладные расходы, которые я получаю при вызове делегата, созданного с использованием LambdaExpression.Compile
, связаны с использованием самих делегатов. Чтобы подтвердить, я создал еще один тест, в котором я вручную создал делегата, напрямую вызывающего метод, и он имел аналогичную производительность.
Поэтому мой вопрос: есть ли разница в объекте делегата, сгенерированном LambdaExpression.Compile
и Delegate.CreateDelegate
?
Я ищу теоретический ответ о разнице между двумя подходами, поэтому я не буду вдаваться в подробности реализации, но вот суть реализации:
- Для делегатов: Запускаем рефлексию и изучаем делегатов, Джон Скит
- Для лямбда-выражений: используя
Expression.Call
,Expression.Parameter
,Expression.Lambda
иExpression.Compile
Delegate.CreateDelegate
, и вызовом делегата, созданного с помощьюLambdaExpression.Compile
? (даже если эта разница невелика). - person Lazlo   schedule 07.04.2017