Недавно я узнал, что во время выполнения можно сгенерировать код C#, и я хотел бы использовать эту функцию. У меня есть код, который выполняет некоторые очень простые геометрические вычисления, такие как вычисления пересечений линейных плоскостей, и я думаю, что я мог бы получить некоторые преимущества в производительности за счет создания специализированного кода для некоторых методов, потому что многие вычисления выполняются для одной и той же плоскости или одной и той же линии и снова. Специализируясь на коде, который вычисляет пересечения, я думаю, что я мог бы получить некоторые преимущества в производительности.Деревья выражений против IL.Emit для специализации во время выполнения
Проблема в том, что я не уверен, с чего начать. От чтения нескольких сообщений в блогах и просмотра документации MSDN я столкнулся с двумя возможными стратегиями для генерации кода во время выполнения: деревья выражений и IL.Emit. Использование деревьев выражений кажется намного проще, потому что нет необходимости изучать что-либо о OpCodes и других связанных с MSIL сложностях, но я не уверен, что деревья выражений так же быстро, как созданные вручную MSIL. Так есть ли какие-либо предложения по тому методу, с которым мне следует идти?
Я бы добавил, что написание собственного ИЛ чревато возможностью пропустить оптимизации, которые может найти компилятор C#. Вы можете захотеть исправить фактический C# и использовать компилятор C# для генерации результирующих ассемблеров: http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx –
@ChrisShain, к сожалению, компилятор C# не делает ни одной из интересных возможных оптимизаций. По какой-то причине даже C++/CLI делает гораздо больше. Вот почему я предпочитаю генерировать код самостоятельно, минуя ограниченные возможности оптимизации C#. Есть вещи, которые очень легко реализовать, но отсутствуют в C# - правильное постоянное распространение, специализация с постоянными аргументами (с инкрустацией), анализ региона и устранение выделения, разворот циклов, слияние переменных, циклический подъем подъемников и т. Д. –
Причина, по которой C# компилятор не делает эти оптимизации, заключается в том, что эта ответственность лежит в компиляторе JIT. Примером здесь является то, что путем перемещения оптимизаций, таких как циклическое разворачивание в JIT-компилятор, они применяются ко всем .NET-языкам. Конечно, JIT-компилятор делает цикл разворачивания, inlining и многое другое. –