Я использую 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
), потому что этот поток делает очень мало, кроме делегирования реальной работы вновь созданным потокам.
main
, почти такое же, как максимум между временем выполнения каждого из потоков. - person PhantomR   schedule 13.05.2018