首页 > 解决方案 > 获取并行 Prolog 程序的运行时间

问题描述

我正在使用 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零件替换为其等效的串行代码,我会得到一个非零时间。

我发现的“解决方法”(但我认为它不是 100% 正确)是使用walltime而不是runtime作为 的第一个参数statistics/2,但我读到墙壁时间就像我可以测量的实际时间,比如说,真正的墙壁时钟,不应用于测量程序执行时间。

编辑:另外,如果我在每个线程的目标中添加类似的计时机制,那么计时也是非零的。我假设runtime只测量运行它的线程的 CPU 时间并0在第一个线程(正在运行的线程main)中进行评估,因为除了将实际工作委托给新创建的线程之外,该线程几乎没有做任何事情。

标签: multithreadingprologswi-prologexecution-time

解决方案


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


推荐阅读