「効率的」をどのように定義するかによって異なります。あなたがパフォーマンスについて尋ねているならば、違いは微妙です。だからあなたのために問題を解決するものを使用してください。多くの場合、pread
は、データベースなどから読み取ったスレッドを扱う場合の唯一のオプションです。他の場合にはread
が賢明なオプションです。そして、pread
はread
より多くなるので、質問はちょっと不公平です。公正な比較はlseek
+ read
であり、間違いなくちょうどpread
よりも遅くなります。
私が利用していたオペレーティングシステムのソースで両方の実装の違いを見てみましょう。私は違いを強調するために両方の関数から正確に同じコードを切り捨てました。これ以上のコードがあります。
これはpread
の一部です:
vp = (struct vnode *)fp->f_data;
if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO ||
(vp->v_flag & VISTTY)) {
return (ESPIPE);
}
offset = SCARG(uap, offset);
if (offset < 0 && vp->v_type != VCHR)
return (EINVAL);
return (dofilereadv(p, fd, fp, &iov, 1, 0, &offset, retval));
これはread
の同等の一部です:だから
return (dofilereadv(p, fd, fp, &iov, 1, 0, &fp->f_offset, retval));
、pread
は、いくつかの余分なチェックが我々が求めてしようとしていないことを確認していpipe、fifo、ttyなどに置いて、文字デバイスから負のオフセットを読み取っていないことを確認します。また、ファイルポインタのオフセット(コード内のfp
)も更新されません。
出典
2013-12-13 08:26:26
Art
pread protoの代わりに2回読み込まれているようです – ShinTakezou
もう1つの関数は読み込み前に特定のオフセットにシークします。したがって、たとえば、 'lseek'に続いて' read'が 'pread'だけを使うより良いかどうかです。決定する1つの方法は、特定のユースケースに対して*ベンチマーク*することです。実際、私はそれを決める唯一の方法だと言っていますが、あなたのユースケースを知らないのでこの質問は答えられません。 –
本当に心配していますか?違いがあれば、おそらく5-6クロックサイクルです。ディスクアクセスは25億〜30百万クロックサイクルです... – Damon