我希望能够评估一个数学表达式,比如y = 2(x * x)+ 2。
但是我需要在循环中进行,其中x可能会变化100000次。
我编写了代码来将表达式转换为解析树。
然后我有一个方法来评估这个解析树。
- (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或其他形式。然后即时加载它以加速循环运行?
非常感谢!
Chris
GCMathParser
或者DDMathParser
吗?它们都被称为非常快速。 - Itai Ferber