Fortran 90でCPU_TIME

(2002-8-28作成)CPU_TIMEは便利ですが、Fortran 95なので、 一部のFortran 90処理系で使えないのが不便です。 ただし、標準化されてなかっただけで、 時間を計ることはFORTRAN 77でもできたので、 それを利用してCPU_TIMEを自作することができます。


例1: Fortran 90規格準拠

コード。 Fortran 90の組込サブルーチンのSYSTEM_CLOCKを使ってみました。 ただし、いわゆるcpu時間ではなくて実時間になります。 規格ではCPU_TIMEは「処理系時間を秒単位で」とあるだけで、 「処理系時間」という用語はあえて処理系定義にしているので 「この処理系では処理系時間とは実時間のことである」と主張すればOK(?)。 たとえば、Windows98系ではそもそも実時間しか計れません。

なお、 組込みサブルーチンであるCPU_TIMEの引数は任意の種別の実数型ですが、 この例では基本実数型で決め打ちになっています。 どの種別でも使えるように総称名を使うにはモジュールが必要になって、 利用側がUSEを使わないといけなくなるところで組込のCPU_TIME とは使い方が変ってくるので、あえて外部サブルーチンにしています。 また、他に特別な指定もなく 外部サブルーチンと同名の組込みサブルーチンがあった場合には 組込みの方を優先する処理系が多いので、 このコードを付けたままFortran 95処理系にかけると、 組込みの方が利用されることも期待できる というのもモジュールにしない利点です (規格的にはどちらが採用されてもよい)。

CPU_TIMEはプログラム実行開始を0にする実装の処理系が多いようですが、 規格ではそういうとりきめはありません。 このCPU_TIMEは実行開始が0になっていません (それどころか、カウンタが一周して終了時間の方が 開始時間より小さくなることもありえます)。


例2: UNIX用

コード。 UNIX用FORTRAN 77にしばしば見られる、 Cライブラリを呼び出すDTIMEを使ってみました。 コードもFORTRAN 77でも使えるように書いてあります。 例1と違って、いわゆるcpu時間が計れますが、多少移植性が限られます。 例1と同様な理由でモジュールにはしていません。


おまけ。CPU_TIMEを使ったサンプルプログラム

コード