下面的Python代碼片段說明了Z3的一個階段性能行爲。如果不調用push()
,則z3會在0.1s內檢查公式。與push()
(沒有額外的斷言),z3需要0.8s。即使在交換s.append(f)
和s.push()
後也會發生類似的結果。爲什麼z3.check()會在z3.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。
謝謝,這是一個很好的repro。 Z3爲第二個實例使用增量求解器。從用例來看,爲什麼會出現這種情況並不清楚,所以它指向了可用性錯誤。在內部,Z3使用工廠模式來創建解算器。我正在研究這是否是原因所在,或者它是否是先前求解器的副作用超越了狀態。 – 2014-10-17 05:35:07
@NikolajBjorner即使片段在不同的Python進程中執行,行爲也是一樣的。 – 2014-10-17 22:55:16