Zrozumienie różnych opcji generowania kodu runtime w C # (Roslyn, CodeDom, Linq Expressions,…?)

Pracuję nad aplikacją, w której chciałbym dynamicznie generować kod do obliczeń numerycznych (dla wydajności). Wykonanie tego obliczenia jako operacji opartej na danych jest zbyt wolne. Aby opisać moje wymagania, rozważ tę klasę:

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

Chcę, aby JIT skompilował funkcję, która implementuje zewnętrzną pętlę w Process. Kod definiujący tę funkcję zostanie wygenerowany przez dane, które są obecnie używane do implementacji ProcessOneSample. Aby wyjaśnić, czego się spodziewam, spodziewam się, że wszystkie wyszukiwania słownika będą wykonywane raz w procesie kompilacji (tj. Kompilacja JIT wiązałaby się bezpośrednio z odpowiednim obiektem w słowniku), tak że gdy skompilowany kod jest rzeczywiście wykonane, to tak, jakby wszystkie wyszukiwania zostały zakodowane na stałe.

Próbuję dowiedzieć się, jakie są najlepsze narzędzia do rozwiązania tego problemu. Powodem, dla którego zadaję to pytanie, jest to, że istnieje tak wiele opcji:

Użyj Roslyn. Bieżąca blokada to sposób powiązania wyrażeń w składni ze zmiennymi składowymi z programu hosta (tj. Wartości ze słownika „stan”).czy to możliwe?Użyj wyrażeń LINQ (Expression.Compile).Użyj CodeDom. Niedawno dowiedziałem się o tym w wyszukiwarce google i co spowodowało to pytanie. Nie jestem zbyt zafascynowany potknięciem się o trzecią strukturę kompilacji w .Net.Mój oryginalny plan, zanim się dowiedziałemkażdy z tych narzędzi istniało wywołanie kodu natywnego (x86), który sam skompilowałem. Mam z tym pewne doświadczenie, ale jest wiele niewiadomych, których jeszcze nie rozwiązałem. Jest to również moja opcja kopii zapasowej, jeśli wykonanie powyższych opcji nie jest wystarczające. Wolałbym jedno z powyższych 3 rozwiązań, ponieważ jestem pewien, że będą one dużo, dużo prostsze, zakładając, że mogę zmusić jednego z nich do pracy!

Czy ktoś ma jakieś doświadczenie z czymś takim, co mogliby udostępnić?

questionAnswers(1)

yourAnswerToTheQuestion