2016-03-15 39 views
3

如何测量日食CLP方法的执行时间?目前,我有这样的:测量执行时间ECLIPSE CLP(或序言)

measure_traditional(Difficulty,Selection,Choice):- 
    statistics(runtime, _), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    time(solve_traditional(Difficulty,Selection,Choice,_)), 
    statistics(runtime,[_|T]), % T 
    write(T). 

我需要把它写了执行方法solve_traditional(...)并写入到一个文本文件的时间。但是,它不够精确。有时时间将打印0.0150.016秒对于给定的方法,但通常它打印0.0秒。

为了证明该方法完成得太快,我决定使用统计(运行时,...)来测量两次运行时调用之间的时间。然后,我可以测量例如了完成20所的方法调用的时间和由20

唯一的问题是划分所测量的时间T,用20个呼叫T等于为0,16,32或48毫秒。显然,它分别测量每个方法调用的时间和发现的执行时间的总和(这往往只是0.0秒)。此跳动测量对于N方法调用运行时和由N.

除以时间T总之的整个目的:当前方法我使用用于执行的时间测量是不够的。有没有办法让它更精确(例如9位小数)?

+0

而不是测量'一次(目标)',写'\ +(在(1,F,_)之间,\ +目标)''适当设置'F' – false

回答

5

标杆是一个棘手的业务在任何编程语言,尤其如此CLP。特别是如果你打算公布你的结果,你应该非常彻底,并确保你正在测量你声称衡量的东西。

定时器:你测量实时,进程CPU时间,线程CPU时间?包括在系统调用中花费的时间?包括或排除垃圾收集? ...

请参阅statistics/2原语提供的不同定时器。 没有可以通过statistics(hr_time,T)访问的实时高分辨率定时器。

定时器分辨率:在你的例子中,定时器分辨率似乎是1/60秒。这意味着,要想让你的时间测量3个显著数字,你必须衡量至少为1000 * 1/60 =16.7秒运行时。

如果你的基准运行时间太短,你必须多次运行它。

运行方差:现代计算机上的人们越来越难以得到可重复计时。这是由于什么都没有做与你测量,如缓存行为,分页,上下文切换,电源管理硬件,内存对齐等

运行足够的重复,在一个安静的运行程序的影响机,请确保您的结果是可重复。

重复基准:在Eclipse这样的系统,运行基准一再必须小心,以保证连续运行真正做同样的计算,理想情况下具有相同或相似的缓存和垃圾收集行为。

在您的代码中,您会连续运行基准测试。建议不要这样做,因为变量实例化,延迟目标或垃圾可以从之前的运行中存活,并减慢或加速后续运行。如上所建议的,则可以使用图案

run_n_times(N,Goal) :- \+ (between(1,N,1,_), \+ Goal). 

这实质上是重复了N次的序列的方式

once(Goal), fail 

这样做的一点是,once/1fail组合撤消所有的Goal的计算,以便下一次迭代尽可能地从类似的机器状态开始。不幸的是,这一撤消过程本身增加了额外的运行时间,扭曲了测量...

测试费用:如果您运行基准测试几次,你需要一个测试框架,这是否对你来说,这有助于您测量的运行时间。

你要么必须确保开销可以忽略不计,或者你必须衡量的开销(例如,通过运行一个虚拟的基准测试框架),并减去它,例如:

benchmark(N, DummyGoal, Goal, Time) :- 
    cputime(T1), 
    run_n_times(N, DummyGoal), 
    cputime(T2), 
    run_n_times(N, Goal), 
    cputime(T3), 
    Time is (T3-T2)-(T2-T1). 

CLP细节: CLP解算器中存在许多其他特定于数据驱动操作的考虑因素,这些因素使得CLP运行时非常难以比较。这些求解有关于传播者,修剪程度的调度许多内部自由度,平局决胜规则在搜索控制等

来讨论这事特别是纸: 在基准约束逻辑编程平台,由Mark Wallace,Joachim Schimpf,Kish Shen和Warwick Harvey组成。在CONSTRAINTS Journal,ed。 E.C.Feruder,9(1),pp 5-34,Kluwer,2004

+0

我仍然经常回到这个答案重温我从你的帖子中学到的东西。非常感谢你的彻底和清晰的解释! – Babyburger