有些時候可能會需要讓程式暫停幾秒,可能是要等設備回應,也有可能,只是要讓CPU休息一下...在Fortran中如何做到這件事呢?
直覺上要讓程式暫停幾秒鐘可以利用讀時間 + do loop,下面阿賢利用SYSTEM_CLOCK這個Fortran90標準副程式以上述的概念實做出一個能讓程式暫停指定秒數的subroutine: sleep_secs。
FORTRAN90 | |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |
program SleepTest implicit none call sleep_secs( 3.456 ) end program SleepTest subroutine sleep_secs( secs ) implicit none real, intent(IN) :: secs real :: dt integer :: C0, C1, CR, CM dt = 0 call SYSTEM_CLOCK( COUNT_RATE = CR, COUNT_MAX = CM ) call SYSTEM_CLOCK( COUNT = C0 ) do while( dt < secs ) call SYSTEM_CLOCK( COUNT = C1 ) if( C1 < C0 ) C0 = C0 - CM - 1 dt = REAL( C1 - C0 ) / CR end do end subroutine sleep_secs |
從主程式呼叫sleep_secs讓程式暫停3.456秒。表面上程式雖然看起來暫停不動,但是實際上CPU還是一直在"讀時間"+"DO LOOP",利用LINUX的time指令看執行時間資訊即可看出來。
real 0m3.459s
user 0m3.454s
sys 0m0.002s
如果暫停的時候要讓CPU能真的休息,試試看非標準函數sleep、sleepqq:
sleep(n):程式休息n秒鐘(secs):gfortran、CVF、intel fortran支援
sleepqq(n):程式休息n毫秒(ms):CVF、intel fortran支援
FORTRAN90 | |
01 02 03 04 05 06 07 08 |
program test implicit none print *, 'Sleep 2 sec.' call sleep(2) print *, 'Sleep 2000 msec.' call sleepqq(2000) end program |
執行結果:
real 0m4.005s
user 0m0.000s
sys 0m0.002s
由執行結果可以看到程式跑了4.005秒,但是沒有花到任合CPU效能,符合我們的預期目標。sleep雖然不是標準函數,但是大多數新的fortran compiler都有支援。下次有需要時不妨試試利用sleep讓程式休息一下。(茶)
外部連結:
SYSTEM_CLOCK(COUNT, COUNT_RATE, COUNT_MAX)
SLEEP(Seconds)
http://en.wikipedia.org/wiki/Orders_of_magnitude_(time)
留言列表