Недавно я проверил производительность приложения F # и, копаясь в CIL, обнаружил, что FSharp.Core (для .NET v4.0) содержит несколько инструкций nop, множество неиспользуемых переменных и переменных, которые только записываются/читаются один раз с помощью последовательностей инструкций stloc/ldloc.
Я исследовал возможные причины и заметил, что даже в режиме выпуска сборки F# включают директиву --debug:pdbonly, и нет никакого способа отключить ее и переключиться на --debug- из пользовательского интерфейса настроек проекта.
Мне интересно, был ли какой-то конкретный выбор для настроек компиляции FSharp.Core, и если да, то какой. В противном случае законно ли ожидать полностью оптимизированную версию среды выполнения?
FSharp.Core не оптимизирован?
Ответы (2)
Похоже, что комментарии к вопросу уже ответили примерно на 90%; повторить их:
- почти каждый бинарный файл релиза во вселенной скомпилирован с --debug:pdbonly
- даже если IL-код неоптимален, это может не иметь никакого реального влияния из-за JIT-оптимизации.
Конечно, существуют всевозможные способы, которыми компилятор F# потенциально может генерировать лучший код (вероятно, это верно для каждого компилятора); если вы профилируете свое приложение и заметите что-то плохое (например, большое несоответствие по сравнению с сопоставимым кодом из C#), вы можете сообщить об этом команде F#, отправив письмо fsbugs. Но сначала измерьте.
В противном случае законно ли ожидать полностью оптимизированную версию среды выполнения?
Предлагаемые вами изменения не могут разумно рассматриваться как оптимизация. Оба безвредны и будут скомпилированы виртуальной машиной. ISTR, мутация используется для замены стека, поскольку виртуальная машина на основе стека может переполнять стек. Итак, F# правильно работает с ошибкой в CLR.
--debug:pdbonly
является нормальным для кода выпуска, он включает только ограниченную информацию об отладке и позволяет декодировать стеки. Вся Windows (включая .NET) устроена так: именно так MS может предоставлять символы на своих серверах символов. - person Richard   schedule 24.08.2010