以下Python代码段说明了Z3的存储性能行为。如果没有push()
调用,z3会在0.1秒内检查公式。使用push()
(并且没有额外的断言),z3需要0.8秒。即使在交换s.append(f)
和s.push()
之后也会出现类似的结果。
import time
import z3
f = z3.parse_smt2_file("smt-lib/QF_BV/RWS/Example_1.txt.smt2")
s = z3.Solver()
s.append(f)
t1 = time.time()
s.check() # 0.10693597793579102 seconds
print(time.time() - t1)
s = z3.Solver()
t1 = time.time()
s.append(f)
s.push()
s.check() # 0.830916166305542 seconds
print(time.time() - t1)
知道为什么会出现这种减速?而且,它如何解决?
我正在使用z3-4.3.2.bb56885147e4-x64-osx-10.9.2。
答案 0 :(得分:4)
您的示例在第二个实例中使用“push”。 这产生了巨大的差异。 Z3的位向量求解器(尚未)可以通过API进行增量使用。 它仅适用于独立断言,不与范围(推/弹)互操作。 第一次调用使用位向量SAT求解器。没有“推/弹”进行。 第二次调用是在“push”调用之后。 Z3然后确定为了跟踪范围依赖性,它必须使用增量SMT核心,它不会从更有效的位向量解算器中受益。