multithreading - 获取并行 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
)中进行评估,因为除了将实际工作委托给新创建的线程之外,该线程几乎没有做任何事情。
解决方案
您正在使用兼容性密钥,主要来自 Quintus Prolog,当时没有线程并且毫秒被认为非常准确。使用本机密钥。一是process_cputime
,返回整个进程(所有线程)的CPU时间。还返回所有已完成thread_cputime
线程
的 CPU 时间,只返回调用线程的时间。所有值都是浮点数,以秒为单位表示时间。分辨率取决于操作系统,在现代操作系统上通常非常准确。cputime
推荐阅读
- python-3.x - Python网络刮刀不会保存图像文件
- c - 给定用户一个 3 位数字,找到并打印它的最小数字
- flutter - 如何处理这个颤振异常(未处理的异常:NoSuchMethodError:方法'findAncestorStateOfType'在null上被调用)
- php - 在 MySQL 中将 SELECT 与字段 + 变量一起使用
- sql-server - 超过推荐值时的 MAXDOP 设置
- ansible - 循环查找文件并删除它们
- git - vscode 错误:无法将引用推送到远程。尝试先运行“拉”以集成您的更改
- regex - 解析 git 历史记录并对其进行模式匹配,一旦找到匹配项,就在变量中捕获附近的值
- ssis - SSIS 2005 至 2019
- mips - how to change value at register in MIPS