2

私は、(パフォーマンスのために) 数値計算用のコードを動的に生成したいアプリケーションに取り組んでいます。この計算をデータ ドリブン操作として行うのは遅すぎます。私の要件を説明するには、次のクラスを検討してください。

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 コンパイルすることです。この関数を定義するコードは、現在 ProcessOneSample を実装するために使用されているデータによって生成されます。私が期待していることを明確にするために、すべての辞書検索がコンパイル プロセスで 1 回実行されることを期待します (つまり、JIT コンパイルは辞書内の関連するオブジェクトに直接バインドされます)。実行すると、すべてのルックアップがハードコーディングされたかのようになります。

私が理解しようとしているのは、この問題に取り組むための最良のツールは何かということです。私がこの質問をしている理由は、非常に多くのオプションがあるからです。

  • Roslyn を使用します。現在の障害は、構文内の式をホスト プログラムのメンバー変数 (つまり、'状態' 辞書内の値) にバインドする方法です。これは可能ですか?
  • LINQ 式 (Expression.Compile) を使用します。
  • CodeDom を使用します。つい最近、私のグーグル検索でこれに気づき、この質問を促したもの. 私は、.Net の 3 番目のコンパイル フレームワークを介してつまずくことにあまり興奮していません。
  • これらのツールの存在を知る前の当初の計画は、自分で JIT コンパイルしたネイティブ コード (x86) を呼び出すことでした。これについてはある程度の経験がありますが、まだ解決していない不明な点がたくさんあります。上記のオプションのパフォーマンスが十分でない場合、これは私のバックアップ オプションでもあります。上記の 3 つのソリューションのいずれかを使用することをお勧めします。それらのいずれかを機能させることができれば、はるかに簡単になると確信しているからです。

このような経験を共有できる人はいますか?

4

1 に答える 1