Понимание различных вариантов генерации кода времени выполнения в 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 компилировал. У меня есть некоторый опыт в этом, но здесь есть много неизвестных, которые я еще не решил. Это также мой вариант резервного копирования, если производительность указанных выше параметров недостаточна. Я бы предпочел одно из трех вышеуказанных решений, потому что я уверен, что они будут намного, намного проще, при условии, что я смогу заставить одно из них работать!

У кого-нибудь есть опыт с чем-то подобным, которым они могли бы поделиться?

Ответы на вопрос(1)

Ваш ответ на вопрос