Я нахожусь в ситуации, когда мне приходится работать с выражениями linq, и мне нужно извлечь из них последний кусочек производительности.После большой работы и реализации всех нижних висячих фруктов я достиг точки, где необходимы микрооптимизации.
Ситуация
interface IThing { void DoThing(); }
class A : IThing { ... } // implicitly implements IThing
Общее использование, интерфейсное поле
// First put an instance into a IThing field
IThing x = new A();
// Then, in a different method:
x.DoThing();
Общеизвестно, что это создает дорогой интерфейсный вызов.
Оптимизированный, явный тип
A x = new A();
// Then, in a different method:
x.DoThing();
На этот раз DoThing
можно вызвать напрямую, так как конкретный тип x
всегда известен (может быть, А нуждается (или, возможно, это поможет еще больше) быть запечатанным, не уверен)
Моя проблема
Теперь, учитывая вышесказанное, я хочу сделать то же самое с System.Linq.Expressions
.
. Я сейчас использую Expression.Constant()
, чтобы "захватить" IThing
в моем дереве выражений.(который я позже поместил в Expression.Lambda и скомпилировал), а затем вызвал для него метод.
Все работает нормально, но я не уверен, что в скомпилированном коде происходит диспетчеризация интерфейса.Если есть, я бы очень хотел избавиться от этого, потому что в прошлом у меня был большой успех с этой оптимизацией.То есть замена интерфейсных вызовов в путях горячего кода на «нормальные» вызовы.
Вопросы:
- Как я могу убедиться, что вызов не будет использовать поиск метода интерфейса?
- Как я могу увидеть, какой машинный код компилируется для делегата?По какой-то причине мне трудно войти в делегат в окне дизассемблирования.
- Код, сгенерированный деревьями выражений, оптимизирован так же, как JIT, как обычный код?
- Есть ли у меняявно указать тип в константе?Или это автоматически определяется по данному объекту?Есть ли какая-либо разница?
- Как «косвенность», хотя делегат влияет на эти вещи?Это может предотвратить некоторые оптимизации?Или может быть переход может быть даже полностью оптимизирован в некоторых ситуациях (может быть, если делегат находится в поле только для чтения или около того?)