我使用的是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
,因为该线程除了委托真实线程之外几乎没有工作到新创建的线程。
答案 0 :(得分:3)
您正在使用兼容性密钥,主要来自Quintus Prolog,当没有线程且毫秒被认为非常准确时。使用本机密钥。一个是process_cputime
,返回整个进程的CPU时间(所有线程)。还有thread_cputime
返回所有已完成的线程的CPU时间,只返回cputime
返回调用线程的时间。所有值都是以秒表示时间的浮点数。分辨率取决于操作系统,通常在现代操作系统上非常准确。