¿Comprender las diversas opciones para la generación de código en tiempo de ejecución en C # (Roslyn, CodeDom, Linq Expressions, ...?)

Estoy trabajando en una aplicación en la que me gustaría generar código de forma dinámica para un cálculo numérico (para el rendimiento). Hacer este cálculo como una operación basada en datos es demasiado lento. Para describir mis requerimientos, considera esta clase:

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

Lo que quiero hacer es JIT compilar una función que implementa el bucle externo en Proceso. El código que define esta función será generado por los datos que se utilizan actualmente para implementar ProcessOneSample. Para aclarar lo que estoy esperando, esperaría que todas las búsquedas del diccionario se realizaran una vez en el proceso de compilación (es decir, la compilación JIT se vincularía directamente al objeto relevante en el diccionario), de modo que cuando el código compilado sea realmente ejecutado, es como si todas las búsquedas hubieran sido codificadas.

Lo que estoy tratando de averiguar es cuáles son las mejores herramientas para abordar este problema. La razón por la que hago esta pregunta es porque hay muchas opciones:

Utilice Roslyn. El bloque de tropiezo actual es cómo vincular expresiones en la sintaxis a las variables miembro del programa host (es decir, los valores en el diccionario de 'estado').es posible?Utilice las expresiones de LINQ (Expression.Compile).Utilice CodeDom. Hace poco me di cuenta de esto en mi búsqueda de Google, y lo que provocó esta pregunta. No estoy muy contento de tropezar con un tercer marco de compilación en .Net.Mi plan original antes de que supieraalguna Una de estas herramientas fue llamar al código nativo (x86) que JIT compilé yo mismo. Tengo algo de experiencia con esto, pero hay muchas incógnitas aquí que aún no he resuelto. Esta es también mi opción de copia de seguridad si el rendimiento de las opciones anteriores no es suficiente. Preferiría una de las 3 soluciones anteriores porque estoy seguro de que serán mucho, mucho más simples, ¡asumiendo que puedo hacer que una de ellas funcione!

¿Alguien tiene alguna experiencia con algo como esto que pueda compartir?

Respuestas a la pregunta(1)

Su respuesta a la pregunta