Если это одноразовая вещь, то я согласен с Ларсманами, что использование gprof или какого-либо другого профилирования - это, вероятно, путь;но я также согласен с тем, что очень удобно иметь в коде более грубые таймеры для синхронизации различных этапов вычислений.Лучшая информация о времени, которую вы имеете, - это то, что вы на самом деле используете, и трудно превзойти то, что выводится каждый раз, когда вы запускаете свой код.
Джеремия Уилкок, указывая на omp_get_wtime()
, очень полезна;он соответствует стандартам, поэтому должен работать на любом компиляторе OpenMP - , но у него есть только второе разрешение, которого может быть или не быть достаточно, в зависимости от того, что вы делаете . Отредактировано ;вышеприведенное было совершенно неверно.
Fortran90 определяет system_clock()
, который также может использоваться на любом совместимом со стандартами компиляторе;Стандарт не определяет временное разрешение, но кажется, что это миллисекунды, а ifort - микросекунды.Я обычно использую его примерно так:
subroutine tick(t)
integer, intent(OUT) :: t
call system_clock(t)
end subroutine tick
! returns time in seconds from now to time described by t
real function tock(t)
integer, intent(in) :: t
integer :: now, clock_rate
call system_clock(now,clock_rate)
tock = real(now - t)/real(clock_rate)
end function tock
И использую их:
call tick(calc)
! do big calculation
calctime = tock(calc)
print *,'Timing summary'
print *,'Calc: ', calctime