2011-02-08 4 views
1

Я делаю некоторые эксперименты с IronPython 2.6.1 и функцией clr.CompileModules для компиляции больших скриптов в сборки. Тестирование показало хорошие улучшения производительности при холодном запуске, но в некоторых случаях импорт скомпилированного модуля на самом деле медленнее, чем выполнение большой строки, представляющей мой код в некоторых случаях.Производительность IronPython с компилированным кодом

Мой вопрос, если я использую что-то вроде

scope.Engine.Execute(string.Format("from {0} import {0}", theModule), scope); 

или функции ImportModule, даже если я получаю новый ScriptSCope обратно делает кэш DLR импорт, достигнутый в других ScriptScopes? Так что, если модуль 1 и модуль 10 импортируют один и тот же тип, я получаю только один раз?

Используется clr.CompileModules предпочтительнее scope.Compile()? Мое понимание - компиляция на лету полезна, если я не хочу управлять дополнительными сборками и хочу только заплатить за компиляцию.

ответ

1

DLR не кэширует импорт, но IronPython делает.

Я думаю, что ваше понимание верное - clr.CompileModules обычно хорош для выгоды от запуска. Вы также можете объединить его с ngen'ing ассамблей, и у вас будет еще лучший запуск. Если вы этого не делаете, то, вероятно, это причина, по которой вы иногда наблюдаете худшую производительность - мы можем избежать JIT при компиляции кода, сначала интерпретируя его, но если вы скомпилируете, нам всегда нужно JIT. Компиляция + ngen является лучшим из обоих миров, кроме необходимости устанавливать все это.

+0

Спасибо, я запустил dotTrace над приложением, а переход на скомпилированный код IronPython определенно похож на путь вперед для работы с холодным запуском. Однако я все еще вижу большое время, проведенное в ImportModule. У меня есть одна сборка с 29 включенными модулями, и я запускаю «из панели импорта foo» внутри той же области, а затем извлекаю переменную, являющуюся классом в C# для использования. Уменьшат импортные зависимости, которые эти модули уменьшают, что время импорта заключается в том, что время импорта самого модуля? –