Entendendo as várias opções de geração de código em tempo de execução em C # (Roslyn, CodeDom, Linq Expressions,…?)

Eu estou trabalhando em um aplicativo onde eu gostaria de gerar dinamicamente código para um cálculo numérico (para desempenho). Fazer esse cálculo como uma operação orientada por dados é muito lenta. Para descrever meus requisitos, considere esta classe:

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];
        }    
    }
}

O que eu quero fazer é JIT compilar uma função que implemente o loop externo no processo. O código que define essa função será gerado pelos dados atualmente usados ​​para implementar ProcessOneSample. Para esclarecer o que estou esperando, eu esperaria que todas as pesquisas de dicionário fossem executadas uma vez no processo de compilação (ou seja, a compilação JIT se ligaria diretamente ao objeto relevante no dicionário), de modo que quando o código compilado fosse realmente executado, é como se todas as pesquisas tivessem sido codificadas.

O que estou tentando descobrir é quais são as melhores ferramentas para resolver esse problema. A razão pela qual estou fazendo esta pergunta é porque existem muitas opções:

Use Roslyn. O atual empecilho é como associar expressões na sintaxe a variáveis ​​de membro do programa hospedeiro (ou seja, os valores no dicionário 'state').Isso é possível?Use expressões LINQ (Expression.Compile).Use o CodeDom. Apenas recentemente se tornou ciente disso no meu google search, e o que motivou essa pergunta. Eu não estou muito feliz em tropeçar meu caminho através de um terceiro quadro de compilação em .net.Meu plano original antes de conhecerqualquer destas ferramentas existia era chamar código nativo (x86) que eu JIT compilou eu mesmo. Eu tenho alguma experiência com isso, mas há muitas incógnitas aqui que eu ainda não resolvi. Essa também é minha opção de backup se o desempenho das opções acima não for suficiente. Eu prefiro uma das 3 soluções acima, porque tenho certeza de que elas serão muito, muito mais simples, supondo que eu possa fazer com que uma delas funcione!

Alguém tem alguma experiência com algo parecido com isso que eles poderiam compartilhar?

questionAnswers(1)

yourAnswerToTheQuestion