获取并行Prolog程序的运行时间

时间:2018-05-12 18:37:29

标签: multithreading prolog swi-prolog execution-time

我使用的是SWI Prolog并且有一个类似的程序:

main :-
   statistics(runtime, [T0|_]),
   thread_create(...),
   thread_create(...),
   thread_join(...),
   thread_join(...),
   statistics(runtime, [T1|_]),
   T is T1 - T0,
   print(T).

问题在于,由于某种原因,T始终为0.但是,如果thread_create / thread_join部分替换为其等效的序列代码,则会得到非零时间。

A'解决方法' (但我认为它并非100%正确)我发现使用walltime代替runtime作为statistics/2的第一个参数,但我读到了墙上的时间就像我测量的实际时间,比如一个真正的挂钟,不应该用来衡量程序的执行时间。

编辑:此外,如果我在每个线程的目标中添加类似的计时机制,则时间也不为零。我假设runtime仅测量运行它的线程的CPU时间,并在第一个线程(运行0)中评估为main,因为该线程除了委托真实线程之外几乎没有工作到新创建的线程。

1 个答案:

答案 0 :(得分:3)

您正在使用兼容性密钥,主要来自Quintus Prolog,当没有线程且毫秒被认为非常准确时。使用本机密钥。一个是process_cputime,返回整个进程的CPU时间(所有线程)。还有thread_cputime 返回所有已完成的线程的CPU时间,只返回cputime返回调用线程的时间。所有值都是以秒表示时间的浮点数。分辨率取决于操作系统,通常在现代操作系统上非常准确。