я хочу вычислить математическое выражение типа y = 2 (x * x) + 2.
Но мне это нужно в цикле, где x изменяется, может быть, 100000 раз.
I написали код для перевода выражения в дерево синтаксического анализа.
Тогда у меня есть метод для оценки дерева синтаксического анализа.
- (double) evaluate:(TreeNode *)node variable:(double)x
{
if ([node _operand] != 0)
{
return [node _operand];
}
else if ([node _variable] != NULL)
{
return x;
}
else if ([node _operator] != NULL)
{
if ([[node _operator] isEqualToString: @"+"])
{
return ([self evaluate:[node left] variable:x] + [self evaluate:[node right] variable:x]);
}
else if ([[node _operator] isEqualToString: @"-"])
{
return ([self evaluate:[node left] variable:x] - [self evaluate:[node right] variable:x]);
}
else if ([[node _operator] isEqualToString: @"*"])
{
return ([self evaluate:[node left] variable:x] * [self evaluate:[node right] variable:x]);
}
else if ([[node _operator] isEqualToString: @"/"])
{
return ([self evaluate:[node left] variable:x] / [self evaluate:[node right] variable:x]);
}
}
return 0;
}
Кто-то сказал: если мне нужно идти на скорость, я могу перевести выражение в код C, скомпилировать и Свяжите его в dll на лету и загрузите (занимает около секунды). Это, плюс мемоизированные версии математических функций, может дать мне лучшую производительность.
Как я могу этого добиться? Как я могу скомпилировать математическое выражение в код C, скомпилировать и связать его с DLL или около того. А затем загрузить его на лету, чтобы ускорить цикл?
Большое спасибо!
Крис