我正在与Z3和Yices合作不到一年就解决了一些研究问题。使用这些求解器,我总是需要评估性能,尤其是两件事:建模/检查所需的时间和空间(内存)(可满足性)。在Z3的情况下,我发现没有直接找到它们的线索。我尝试使用“统计”(使用Z3 NET API提供的“DisplayStatistics”功能),并找到如下所示的输出(例如):
NUM。冲突:122
NUM。决定:2245
NUM。传播:27884(二进制:21129)
NUM。重启:1
NUM。最终检查:1
NUM。分钟。 lits:52
NUM。添加了方程式:3766
NUM。 mk bool var:2782
NUM。 del bool var:658
NUM。 mk enode:1723
NUM。 del enode:78
NUM。 mk子句:3622
NUM。 del子句:1517
NUM。 mk bin子句:3067
NUM。 mk lits:18935
NUM。 ta冲突:28
NUM。添加行:5091
NUM。枢轴:328
NUM。断言:2597
NUM。断言上限:3416
NUM。断言:1353
NUM。约束道具:787
NUM。固定方程:697
NUM。偏移量eqs:866
NUM。伪nl。:34
NUM。 EQ。适配器:820
我不知道如何解释这些值来理解使用的内存/时间。有一些方法可以找到运行时间(使用秒表等计时器类)。但是,在空间要求的情况下,我没有找到任何办法。如果我能得到建模所需的布尔变量(低级,SAT求解器)的数量对我来说非常好。
如果有人能告诉我解决方案,那就太好了。
答案 0 :(得分:2)
您使用的是哪个版本的Z3?最新版本(Z3 3.2)包括内存消耗统计信息。它将显示为max. heap size
。话虽这么说,评估Z3性能的最佳方法是使用z3.exe
。 Z3可执行文件将报告时间和内存消耗。此外,API还没有提供一些性能改进。
对于多种应用,文本界面是理想的选择。也就是说,您的应用程序通过管道使用SMT 2.0命令与Z3进程通信。主要优点是:使用不同的SMT求解器非常容易并进行比较;很容易杀死Z3并重新启动它;你可以创建几个不同的过程;如果Z3死了你的应用程序不会死。当然,这种解决方案不适合执行数千个简单查询的应用程序,或者需要与Z3紧密集成(例如Scala^Z3
)。