Я работаю над приложением, в котором хочу динамически генерировать код для числового расчета (для производительности). Выполнение этого расчета как операции, управляемой данными, слишком медленно. Чтобы описать мои требования, рассмотрим этот класс:
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. Чтобы уточнить, что я ожидаю, я ожидаю, что все поиски по словарю будут выполняться один раз в процессе компиляции (т. е. JIT-компиляция будет напрямую связываться с соответствующим объектом в словаре), так что когда скомпилированный код фактически выполняется, как если бы все поиски были жестко запрограммированы.
Я пытаюсь выяснить, какие инструменты лучше всего подходят для решения этой проблемы. Причина, по которой я задаю этот вопрос, заключается в том, что существует так много вариантов:
- Используйте Рослин. Текущий камень преткновения заключается в том, как связать выражения в синтаксисе с переменными-членами из основной программы (т.е. значениями в словаре «состояние»). Возможно ли это?
- Используйте выражения LINQ (Expression.Compile).
- Используйте Коддом. Только недавно стало известно об этом в моем поиске Google, и что вызвало этот вопрос. Я не в восторге от того, что спотыкаюсь о третий фреймворк компиляции в .Net.
- Мой первоначальный план, прежде чем я узнал, что существует любой из этих инструментов, состоял в том, чтобы вызвать собственный код (x86), который я скомпилировал самостоятельно. У меня есть некоторый опыт в этом, но здесь много неизвестных, которые я еще не решил. Это также мой резервный вариант, если производительности вышеперечисленных вариантов недостаточно. Я бы предпочел одно из трех вышеперечисленных решений, потому что я уверен, что они будут намного проще, если я смогу заставить одно из них работать!
Есть ли у кого-нибудь опыт с чем-то подобным, которым они могли бы поделиться?
double
свойствами)? - person svick   schedule 29.09.2013