Понимание различных вариантов генерации кода времени выполнения в C # (Roslyn, CodeDom, Linq Expressions,…?)
Я работаю над приложением, в котором я хотел бы динамически генерировать код для численного расчета (для повышения производительности). Выполнение этого вычисления как операции, управляемой данными, выполняется слишком медленно. Чтобы описать мои требования, рассмотрим этот класс:
class Simulation
{
Dictionary<string, double> nodes;
double t, dt;
private void ProcessOneSample()
{
t += dt;
// Expensive operation that computes the state of nodes at the current t.
}
public void Process(int N, IDictionary<string, double[]> Input, IDictionary<string, double[]> Output)
{
for (int i = 0; i < N; ++i)
{
foreach (KeyValuePair<string, double[]> j in Input)
nodes[j.Key] = j.Value[i];
ProcessOneSample();
foreach (KeyValuePair<string, double[]> j in Output)
j.Value[i] = nodes[j.Key];
}
}
}
Я хочу, чтобы JIT скомпилировал функцию, которая реализует внешний цикл в Process. Код, который определяет эту функцию, будет сгенерирован данными, которые в настоящее время используются для реализации ProcessOneSample. Чтобы прояснить, что я ожидаю, я ожидал бы, что все поиски по словарю будут выполнены один раз в процессе компиляции (то есть компиляция JIT будет привязана непосредственно к соответствующему объекту в словаре), так что когда скомпилированный код действительно выполнено, как если бы все поиски были жестко закодированы.
То, что я пытаюсь выяснить, это то, что лучшие инструменты для решения этой проблемы. Я задаю этот вопрос по той причине, что вариантов так много:
Используйте Roslyn. Текущий камень преткновения заключается в том, как связать выражения в синтаксисе с переменными-членами из хост-программы (то есть со значениями в словаре 'state').Это возможно?Используйте выражения LINQ (Expression.Compile).Используйте CodeDom. Совсем недавно стало известно об этом в моем поиске в Google, и что вызвало этот вопрос. Я не слишком огорчен тем, что споткнулся о третью структуру компиляции в .Net.Мой оригинальный план, прежде чем я зналЛюбые Из этих инструментов существовал вызов нативного кода (x86), который я сам JIT компилировал. У меня есть некоторый опыт в этом, но здесь есть много неизвестных, которые я еще не решил. Это также мой вариант резервного копирования, если производительность указанных выше параметров недостаточна. Я бы предпочел одно из трех вышеуказанных решений, потому что я уверен, что они будут намного, намного проще, при условии, что я смогу заставить одно из них работать!У кого-нибудь есть опыт с чем-то подобным, которым они могли бы поделиться?