Избегаем ненужного бокса в DLR

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

В основном, как я понимаю, вы передаете объекты в деревьях выражений, но используете связыватели, чтобы предоставить динамическую функциональность ваших объектов другим языкам, поддерживающим DLR. Таким образом, вместо того, чтобы выполнять добавление, например, непосредственно в дереве выражения (с помощью Expression.Add), вы создаете связыватель, который вызывается сайтом вызова всякий раз, когда это необходимо, и выполняет добавление за вас.

Однако, поскольку вы передаете объекты, в конце операции сложения (если операнды, например, два значения Int32) вам придется поместить полученный Int32 в объект, поскольку (все еще в связке), что вызов сайт ожидает. Я немного боюсь, что эта постоянная упаковка / распаковка может несколько повлиять на производительность среды выполнения.

Неужели так оно и должно работать (со всей упаковкой / распаковкой) или мне чего-то не хватает?


person Tamas Czinege    schedule 26.10.2009    source источник


Ответы (2)


В языке с динамической типизацией идентификация и оптимизация статически типизированной переменной является оптимизацией для конкретной предметной области. В конкретной реализации динамического языка X вы можете сохранить распакованную локальную переменную в сгенерированном коде, но как только вы открываете динамически типизированный API, нет никакого способа гарантировать статическую типизацию (сама природа динамических языков).

Чтобы избежать боксов, вам нужно будет идентифицировать фрагменты кода, которые можно использовать для подтверждения статических типов, и сгенерировать код специально для них либо с помощью Linq.Expressions, либо ILGenerator.

person Sam Harwell    schedule 26.10.2009

Что касается подшивок, вы также можете реализовать настраиваемую подшивку. Это настраиваемое связующее может либо возвращать не объектный тип, либо выполнять другие конкретные оптимизации. В IronPython мы используем внешний слой DLR ComboBinder и ComboActionRewriter для оптимизации условных выражений. Например, «if a.b:» может превратиться в ComboBinder, который выполняет как a.b, так и преобразование в bool. Если a.b дает bool без упаковки, мы избегаем упаковки и распаковки. Мы планируем поэкспериментировать с другими подобными оптимизациями.

person Dino Viehland    schedule 27.10.2009