Как я могу помочь JIT предотвратить отправку интерфейса в Expression.Lambdas? - PullRequest
0 голосов
/ 22 января 2019

Я нахожусь в ситуации, когда мне приходится работать с выражениями 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 и скомпилировал), а затем вызвал для него метод.

Все работает нормально, но я не уверен, что в скомпилированном коде происходит диспетчеризация интерфейса.Если есть, я бы очень хотел избавиться от этого, потому что в прошлом у меня был большой успех с этой оптимизацией.То есть замена интерфейсных вызовов в путях горячего кода на «нормальные» вызовы.

Вопросы:

  1. Как я могу убедиться, что вызов не будет использовать поиск метода интерфейса?
  2. Как я могу увидеть, какой машинный код компилируется для делегата?По какой-то причине мне трудно войти в делегат в окне дизассемблирования.
  3. Код, сгенерированный деревьями выражений, оптимизирован так же, как JIT, как обычный код?
  4. Есть ли у меняявно указать тип в константе?Или это автоматически определяется по данному объекту?Есть ли какая-либо разница?
  5. Как «косвенность», хотя делегат влияет на эти вещи?Это может предотвратить некоторые оптимизации?Или может быть переход может быть даже полностью оптимизирован в некоторых ситуациях (может быть, если делегат находится в поле только для чтения или около того?)
...