Я использую 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
измеряет время ЦП только для потока, в котором он выполняется, и оценивается в 0
в первом потоке (в котором запущен main
), потому что этот поток делает очень мало, кроме делегирования реальной работы вновь созданным потокам. .