Понимание различных вариантов генерации кода времени выполнения в C # (Roslyn, CodeDom, Linq Expressions,…?)

я работаю над приложением, где яЯ хотел бы динамически генерировать код для численного расчета (для производительности). Выполнение этого вычисления как операции, управляемой данными, выполняется слишком медленно. Чтобы описать мои требования, рассмотрим этот класс:

class Simulation
{
    Dictionary 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 Input, IDictionary Output)
    {
        for (int i = 0; i < N; ++i)
        {
            foreach (KeyValuePair j in Input)
                nodes[j.Key] = j.Value[i];
            ProcessOneSample();
            foreach (KeyValuePair j in Output)
                j.Value[i] = nodes[j.Key];
        }    
    }
}

Я хочу, чтобы JIT скомпилировал функцию, которая реализует внешний цикл в Process. Код, который определяет эту функцию, будет сгенерирован данными, которые в настоящее время используются для реализации ProcessOneSample. Чтобы уточнить, что яЯ ожидаю, яя ожидал, что все поиски по словарю будут выполнены один раз в процессе компиляции (то есть компиляция JIT будет привязана непосредственно к соответствующему объекту в словаре), так что когда фактически выполняется скомпилированный код, все как будто все поиски был жестко закодирован.

Что я'Я пытаюсь понять, каковы лучшие инструменты для решения этой проблемы. Причина яЯ задаю этот вопрос, потому что есть так много вариантов:

Используйте Roslyn. Текущий камень преткновения заключается в том, как связать выражения в синтаксисе с переменными-членами из хост-программы (т. Е. Значения в 'государство' толковый словарь).Это возможно?Используйте выражения LINQ (Expression.Compile).Используйте CodeDom. Совсем недавно стало известно об этом в моем поиске в Google, и что вызвало этот вопрос. Я'Я не слишком спотыкаюсь о том, чтобы споткнуться о третью структуру компиляции в .Net.Мой оригинальный план, прежде чем я зналлюбой Из этих инструментов существовал вызов нативного кода (x86), который я сам JIT компилировал. У меня есть некоторый опыт в этом, но здесь есть много неизвестных, которые я еще не решил. Это также мой вариант резервного копирования, если производительность указанных выше параметров недостаточна. Я'Я бы предпочел одно из трех решений, потому что я уверен, что они будут намного, намного проще, если я смогу заставить одно из них работать!

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

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

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