Prolog中微基准测试的维度

重复

我想微基准谓词int_cntA / 2 ...

int_cntA(I,W) :- I >= 0, int_cntA0_cntA(I,0,W).

int_cntA0_cntA(0,W0,W) :- !, W0 = W.
int_cntA0_cntA(I,W0,W) :- I0 is I/\(I-1), W1 is W0+1,      int_cntA0_cntA(I0,W1,W).

...针对谓词int_cntB / 2:

int_cntB(I,W) :- I >= 0, int_cntB0_cntB(I,0,W).

int_cntB0_cntB(0,W0,W) :- !, W0 = W.
int_cntB0_cntB(I,W0,W) :- I0 is I>>1,     W1 is W0+(I/\1), int_cntB0_cntB(I0,W1,W).

我不确定要获得良好的结果需要考虑什么... 100%甚至是有趣的尺寸?

到目前为止,我想到了:我应该将元通话性能纳入基准,还是应该处理原始号码?回路是否应由故障驱动?我是否应该关心执行过程中产生的垃圾?

以下代码段是一个简单的基准测试实现,可实现原始性能,受故障驱动并且(因此)不关心垃圾:

:- use_module(library(between)).

rep_10.
rep_10.
rep_10.
rep_10.
rep_10.
rep_10.
rep_10.
rep_10.
rep_10.
rep_10.

rep_100M :- rep_10, rep_10, rep_10, rep_10, rep_10, rep_10, rep_10, rep_10.

int_cntA / 2的代码:

benchA_1(I,W,Rt) :- statistics(runtime,_),
                    ( repeat(100000000),      int_cntA(I,W), false ; true ),
                    statistics(runtime,[_,Rt]),
                    int_cntA(I,W).

benchA_2(I,W,Rt) :- statistics(runtime,_),
                    ( between(1,100000000,_), int_cntA(I,W), false ; true ),
                    statistics(runtime,[_,Rt]),
                    int_cntA(I,W).

benchA_3(I,W,Rt) :- statistics(runtime,_),
                    ( rep_100M,               int_cntA(I,W), false ; true ),
                    statistics(runtime,[_,Rt]),
                    int_cntA(I,W).

int_cntB / 2的代码:

benchB_1(I,W,Rt) :- statistics(runtime,_),
                    ( repeat(100000000),      int_cntB(I,W), false ; true ),
                    statistics(runtime,[_,Rt]),
                    int_cntB(I,W).

benchB_2(I,W,Rt) :- statistics(runtime,_),
                    ( between(1,100000000,_), int_cntB(I,W), false ; true ),
                    statistics(runtime,[_,Rt]),
                    int_cntB(I,W).

benchB_3(I,W,Rt) :- statistics(runtime,_),
                    ( rep_100M,               int_cntB(I,W), false ; true ),
                    statistics(runtime,[_,Rt]),
                    int_cntB(I,W).

在运行SICStus Prolog 4.3.1的Intel Core i7 Haswell计算机上,由于不同的基准测试方法(A,B,C)导致的最坏情况下的性能差异超过100%:

| ?- benchA_1(0,W,Rt).
W = 0,
Rt = 3140 ? 
yes
| ?- benchA_2(0,W,Rt).
W = 0,
Rt = 4130 ? 
yes
| ?- benchA_3(0,W,Rt).
W = 0,
Rt = 1960 ? 
yes

您是否有想法/是否可以进一步减少微基准测试的开销?谢谢!

莫斯托夫斯基崩溃

您必须注意冷暖运行。现代的Prolog系统具有及时索引甚至编译功能。这样不同的运行行为可能会有所不同。同样,垃圾收集会使时间变化。

我总是测量暖跑,所以我至少要先运行一次基准测试并放弃测量。然后我再次运行它并记下该措施。

融合不同的循环。通常的方法是通过将伪谓词插入到循环中并测量循环时间来测量循环开销。然后再减去这个时间。伪谓词可以轻松定义为:

  dummy.

如果您看到循环的开销很小,那么我认为不要花费减去循环开销的长度,并且明确指出您的测量结果也可以测量循环,这也是有效的。

使用相同的循环时,即使不进行减法运算,仍然可以比较线束所运行的不同测试对象的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用文件中的数据进行微基准测试?

来自分类Dev

JMH微基准测试递归快速排序

来自分类Dev

Java 8用于微基准测试的框架

来自分类Dev

在JMH中对具有不同值的循环进行微基准测试

来自分类Dev

在应用程序服务器中运行微基准测试[JMH]

来自分类Dev

如何使用Java 12的微基准测试套件?

来自分类Dev

Ruby中的基准测试方法

来自分类Dev

FreeBSD中的MySQLSlap基准测试

来自分类Dev

微基准Clojure功能

来自分类Dev

使用JMH Java微基准测试的随机数据测试浮点打印

来自分类Dev

多线程环境中的基准测试

来自分类Dev

防止在Criterion基准测试中缓存计算

来自分类Dev

在Go中绘制基准测试结果

来自分类Dev

BaseX中的基准测试:如何设置

来自分类Dev

如何使用core.async实现Skynet 1m微基准测试?

来自分类Dev

微基准测试结果检查失败,data.table被引用更改

来自分类Dev

为什么第一次进行微基准测试总是最慢?

来自分类Dev

在Webdriver中对Firefox和Chrome的内存消耗进行基准测试

来自分类Dev

如何在Elasticsearch中对执行进行基准测试?

来自分类Dev

在这个基准测试中,Node的速度有多快?

来自分类Dev

在python中对运行时间进行基准测试

来自分类Dev

卡尺基准测试中的非确定性分配行为

来自分类Dev

如何在Crypto ++库基准测试中运行?

来自分类Dev

在Julia中对数组的条件赋值进行基准测试

来自分类Dev

如何在Elasticsearch中对执行进行基准测试?

来自分类Dev

riscv 基准测试中与 vvadd 和 mt-vvadd 的区别

来自分类Dev

基准测试结果奇怪

来自分类Dev

访问基准测试结果

来自分类Dev

MATLAB性能基准测试