私はいくつかのFortranコードの性能を測定しようとしていますが、現在はETIME
を使用しています(基本的にはドキュメントの例と同じです)。ただし、TIME
の値はリアルタイムで計測されないようです(UNIXユーティリティtime
の「実際の」出力と一致しません)。ETIMEとCPU_TIMEの関係は何ですか?
CPU_TIME
は、プログラムの実際の実行時間のより良い尺度ですか?私はTIME
からETIME
まではユーザーとシステム時間の合計を与えると考えていたので、リアルタイムで同じか近い(またはCPU_TIME
)でしょうか?
コードは子プロセスをフォークしません。
マニュアルの例に基づいて、以下に相当するコードです。 time ./program
で実行してください)。
実際のコードはディスクに書き込まれ、いくつかの個々のプロセスが同時に実行されている場合はリアルタイム(time
によって報告される)が上がります。ただし、ETIME
でもCPU_TIME
でも変化は検出されません。
time
から実際に報告された時間は、ETIME
またはCPU_TIME
によって報告された時間の2倍までである可能性があります。
program test_etime
integer(8) :: i, j
real, dimension(2) :: tarray
real :: result
real :: start, finish
!
! Comment out relevant part
!
print *, "TESTING ETIME"
call ETIME(tarray, result)
print *, result
print *, tarray(1)
print *, tarray(2)
do i=1,100000000 ! Just a delay
j = i * i - i
end do
call ETIME(tarray, result)
print *, result
print *, tarray(1)
print *, tarray(2)
!print *, "TESTING CPU_TIME"
!call cpu_time(start)
!do i=1,100000000 ! Just a delay
! j = i * i - i
!end do
!call cpu_time(finish)
!print '("Time = ",f6.3," seconds.")',finish-start
end program test_etime
(最後の1にこっそり;?なぜCALL ETIME (...)
構文が推奨されます)
例を挙げることができますか。有効な最小限のプログラム、UNIXの 'time'から取得したタイミング、' ETIME'コールからの出力これは、あなたのタイミングが2つの方法の間でどのように異なるかを人々に知ってもらうでしょう。 –
ディスクを使っていくつかのプロセスを同時に実行し、報告された 'real'時間と実際には一致しないものを実際に生成するため、小さな問題を書くのは難しいです。私が望むのは 'SYSTEM_CLOCK'だと思っていますが、私は何とか' ETIME'の 'TIME'から得たものと期待していました。 – gauteh
あなたの例を実行すると、ETIMEが '0.7029s 'という報告をしていますが、時間は' real:0.713s;ユーザ:0.702秒; sys:0.002s'となります。したがって、 'user'と' sys'を合計すると、ETIMEが報告するものにちょっとしたものが得られます。リアルタイムはユーザーとsysの合計と等しくないことに注意してください。これは、プロセスのCPU使用率が100%未満であることを示します。これは、プロセスがI/Oを待っている場合におそらく発生する可能性があります。 –