Java - 用户输入数学函数的高效评估(可能的准备,现有变量)

时间:2016-02-27 10:38:47

标签: java performance math processing-efficiency

在Java程序中有一个变量t来计算时间(相对于程序启动,而不是系统时间),如何将用户输入的String转换为可在需要时有效评估的数学公式。 (基本上,公式的准备工作可能很慢,因为它发生在运行时之前,但每个存储的函数可能在运行期间被调用多次,然后必须进行有效评估)

由于我找不到一个数学解析器,它会保存一个公式以供以后参考,而不是找到解决y = f(x)方程的一般图形,我正在考虑让我的Java程序生成一个脚本( JS,Python等)输出String,然后用当前的t作为输入参数调用所述脚本。 - 但是我被告知Scripts相当慢,因此对于实时应用来说是不切实际的。

有更有效的方法吗? (我甚至会考虑让我的Java应用程序为每个用户输入生成并编译C代码,如果这样可行的话)

编辑:树构造确实可以存储表达式,但是根据我的理解来评估仍然相当慢,我需要在评估时将其转换为表达式链(如在遍历树对象中)应该比直接求解方程需要更多的调用。相反,我将尝试生成其他java类。

2 个答案:

答案 0 :(得分:1)

我所做的是在运行时生成Java代码并进行编译。有许多库可以帮助你做到这一点,我写的是https://github.com/OpenHFT/Java-Runtime-Compiler这样就可以像你自己手工编写Java代码一样高效,如果被调用足够多次将被编译为本机代码。

答案 1 :(得分:0)

您能否提供有关假定功能类型和要求性能的一些信息?也许仅仅使用数学解析器库就足够了,它只使用变量预编译包含数学公式的字符串一次,然后使用这种预编译形式的公式来提供结果,即使变量值正在变化?这种解决方案非常快,因为它通常不需要重复字符串解析,语法检查等等。

我最近用于我的项目的这种开源数学解析器的一个例子是mXparser:

mXparser on GitHub

http://mathparser.org/

包含函数定义的用法示例

Function f = new Function("f(x,y) = sin(x) + cos(y)");
double v1 = f.calculate(1,2);
double v2 = f.calculate(3,4);
double v3 = f.calculate(5,6);

在上面的代码中,在计算v1之前,实际的字符串解析只会进行一次。进一步计算v1,v2(可能的vn)将在快速模式下完成。

此外,您可以在字符串表达式中使用函数定义

Expression e = new Expression("f(1,2)+f(3,4)", f);
double v = e.calculate();