为什么从Z3JavaAPI获取查询结果比直接从z3获取查询结果要慢?

为什么从Z3JavaAPI获取查询结果比直接从z3获取查询结果要慢?,java,z3,smt,Java,Z3,Smt,刚才注意到,对于一些基准测试,通过JavaAPI从z3获取查询结果的速度非常慢。但是,如果我只是将查询转储为smt2格式,并直接在命令行中运行z3,则只需不到一秒钟的时间。想知道为什么吗?我注意到您的问题包含一个(push)命令,删除该命令会显著改变性能。当Z3第一次看到一个(push)时,它会切换到另一个支持增量的解算器,这会对性能产生显著影响。通过-v:15将详细度设置为15,Z3s输出的第一行告诉您它正在使用哪个解算器,例如,当出现push命令时,它会显示 (combined-solver

刚才注意到,对于一些基准测试,通过JavaAPI从z3获取查询结果的速度非常慢。但是,如果我只是将查询转储为smt2格式,并直接在命令行中运行z3,则只需不到一秒钟的时间。想知道为什么吗?

我注意到您的问题包含一个
(push)
命令,删除该命令会显著改变性能。当Z3第一次看到一个
(push)
时,它会切换到另一个支持增量的解算器,这会对性能产生显著影响。通过-v:15将详细度设置为15,Z3s输出的第一行告诉您它正在使用哪个解算器,例如,当出现
push
命令时,它会显示

(combined-solver "using solver 2 (without a timeout)")
如果不是,它就会说

(combined-solver "using solver 1")

对于给定的示例,解算器2恰好要快得多

此问题可能是由于使用了不同的选项或策略造成的(还请注意,在调试配置中,Z3速度较慢,并且使用了不同的策略)。你有一个(小的)例子,这样我就可以看到使用了什么选项,调用了什么策略?@ChristophWintersteiger,刚刚选中,没有通过z3javaapi设置特殊选项。我的谷歌硬盘上有一个例子(不够小,不能粘贴在这里),你也有来自JavaAPI的相应问题吗?也许一个日志文件(通过Log.open)是最好的共享方式。