我正在开发一个应用程序,我想动态生成用于数值计算的代码(用于性能)。将此计算作为数据驱动操作进行太慢。为了描述我的要求,请考虑这个类:
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 编译一个在 Process 中实现外循环的函数。定义此函数的代码将由当前用于实现 ProcessOneSample 的数据生成。为了澄清我的期望,我希望在编译过程中执行一次所有字典查找(即 JIT 编译将直接绑定到字典中的相关对象),这样当编译的代码实际上是执行时,就好像所有的查找都被硬编码了一样。
我想弄清楚的是解决这个问题的最佳工具是什么。我问这个问题的原因是因为有很多选择:
- 使用罗斯林。当前的绊脚石是如何将语法中的表达式绑定到来自宿主程序的成员变量(即“状态”字典中的值)。这可能吗?
- 使用 LINQ 表达式 (Expression.Compile)。
- 使用 CodeDom。最近才在我的谷歌搜索中意识到这一点,以及是什么引发了这个问题。我对在.Net 中的第三个编译框架中跌跌撞撞并不太兴奋。
- 在我知道之前我的原始计划这些工具存在之前,我最初的计划是调用我自己 JIT 编译的本机代码 (x86)。我对此有一些经验,但是这里有很多未知数我还没有解决。如果上述选项的性能不够,这也是我的备用选项。我更喜欢上述 3 种解决方案中的一种,因为我相信它们会简单得多,假设我可以让其中一种工作!
有没有人有类似的经验可以分享?