ToDo:
Fortran90から入った停留入力で制御文字"\\r"の振るまい奇妙なので、 実装ごとの挙動を調べてみました。
ここでは、"\\r","\\n","\\r\\n"などの改行記号が 入力列に含まれて際の read文からの戻り値を調べています。 サンプルとした入力列は、"abc\\rdef\\n\\nABCDEF\\r\\n123456\\neof"です。 この入力列は、標準入力(UNIT=5)とファイル経由(UNIT=10)で テストプログラムに入力され、read文で停留入力による読み取りが行われます。
g95 0.91 20080220の場合
標準入力 | "abc\\rdef",size=7,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
ファイル | "abc\\rdef",size=7,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
gfortran 4.2.4 20080220 (prerelease)の場合
標準入力 | "abc",size=3,iostat=-2 | "ef",size=2,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
ファイル | "abc",size=3,iostat=-2 | "def",size=3,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
gfortran 4.3.0 20080221 (prerelease)の場合
標準入力 | "abc",size=3,iostat=-2 | "ef",size=2,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
ファイル | "abc",size=3,iostat=-2 | "def",size=3,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
Intel Fortran Compiler Version 8.1の場合
標準入力 | "abc\\rdef",size=7,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
ファイル | "abc\\rdef",size=7,iostat=-2 | "",size=0,iostat=-2 | "ABCDEF",size=6,iostat=-2 | "123456",size=6,iostat=-2 | "eof",size=3,iostat=-2 |
つまり、改行区切りなテキスト読み込み(itfgetbuf_)には使えるが、uni-byte stream入力には使えないと言うこと
itfgetbuf_の実装を
で行ったものを比較すると、read(2)が断トツに遅いのは予定通りだとしても、 停留入力がFGETCより遅いのは納得がいかないな
Intel Fortran 8.1で試すと、処理時間比は Q editing:FGETC:停留入力:read(2)で1:1.7:7:23ぐらいで、 FGETCに比べるて停留入力が4倍近く遅い... Orz
gfortranだと、FGETC:停留入力:read(2)で 1:1.6:8.9ぐらいでそれほど激しい差では無いですが停留入力の方が遅い
内容的には、I/O library側でループを組める&最適化できるので FGETCのループより早くてもよさそうなモノですが...
itfgetbuf_の実装に限れば、
ということですね。 実際は、binary Read[]で FGETC intrinsicが使われているので FGETCが未実装の場合、整合性を取ろうとするとread(2)で 全部実装するしかないのですが... (それでも、Write[]とFileSeek[]との完全には整合性しない)
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記