我在使用Z3 for Java的当前项目中遇到了一些性能问题:
基本上我目前的大部分限制都非常简单:
例如:(f(x) = 2 && f(y) <= 3) || f(x) <=5
我正在使用整个项目共享的静态上下文和解算器实例:
public class ConstraintManager {
static Context ctx;
static Solver solver;
...
}
如果我使用相同的ctx实例生成expr数十亿次,那是否会出现问题?何时是调用ctx.Dispose()
的最佳时间,或者,管理ctx的最佳方法是什么?
我调用expr.Simplify()
来简化一些约束,例如:f(x)=3 && f(x)<=2
。
但是这个API结果非常慢。特别是约束的长度增加了。这是一个已知问题还是因为我错误地使用了它?
我正在使用expr.substitute(expr1, expr2)
,但我注意到z3会在替换后将expr转换为let-binding形式。这是为了使配方更紧凑吗?
答案 0 :(得分:1)
.NET和Java API使用垃圾收集器来管理术语的生命周期。它们由GC自行决定回收。为获得最佳性能,您可以自行管理引用计数,但是您必须绕过支持的API。发布的源代码包含与此相关的JNI / pinvoke。请注意,滚动自己的低级API需要做很多工作,低级引用计数也不像支持的API那样容易编程。