2005-11-10
●
getc と read の速度差
getc() は、Linux C Library (libc) では、iostdio.h で
#define getc(_fp) _IO_getc(_fp)
と定義されたマクロで、さらに libio.h 中で
#define _IO_getc(_fp) \
((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end ? __uflow(_fp) \
: *(unsigned char*)(_fp)->_IO_read_ptr++)
と定義されている。つまり、getc を呼ぶと必ず三項演算子が呼ばれて比較が行われる。これが速度低下の原因のようだ(関数版もロックを除けば動作は同じ)。
でも、実際はどうなんだろう。何かが引っかかる…
昔、「read は使うな、getc を使え」を言われた記憶はあるんだけれど、どこで誰にどういうシチュエーションで言われたのかさっぱり思い出せない。多分移植性の話をしていたときに、高級関数(?)であるgetcのほうがアーキテクチャの壁を越えられるからだ、という説明だったような気がするが、少なくとも getc のソース(?)を見る限りでは、それほど依存性には違いがないような気がする。
(2005/11/13追記)
getc()の戻り値の型がintなのに対し、read()は「void* なバッファに○○バイトを読み込む」という定義なので1キャラクタが2バイトになるファイルシステム*1ではうまく動作しない、とかそういうことだっけかな?
*1 あるのかそんなの

冬のボーナスで買おうと思ってたけど・・・<br>まぁ、私が「欲しい」と言った瞬間に父ちゃんが1株買ったからいいかw
> どこで誰にどういうシチュエーションで言われたのかさっぱり思い出せない。<br><br>私、そう言う記憶が増えてきた…ヤバいな。<br>忘れようとしても思い出せないぜー。
ん〜、ひょっとしてひょっとして<br><br><br>…そういうお年頃ですか、我々。
スタバ株、株券はいらないから株主優待券くれー
いいなあ…伸び盛りの株、業種は…<br>インフラ系と違ってサービス系の強みはそこだよなぁ<br><br>うちは「一度構築したらそれっきり」観測が出た所に<br>「今期配当なし」発表しちゃったもんだからねぇ…
株価と業績は違いますから…特に今回のスタバ株の高騰は<br>実際の業績と乖離した動きなのでいわゆる「投機」です。<br>そういうのに翻弄される会社はむしろかわいそうです。