Hängt davon ab, wie Sie "effizient" definieren. Wenn Sie nach Leistung fragen, ist der Unterschied mikroskopisch. Verwenden Sie also den, der das Problem für Sie löst. In vielen Fällen ist pread
die einzige Option, wenn es sich um Threads handelt, die aus einer Datenbank oder einer anderen Datenbank lesen. In anderen Fällen ist read
die einzig sinnvolle Option. Und die Frage ist ein bisschen unfair, da pread
mehr als read
tut. Ein fairer Vergleich wäre lseek
+ read
, die definitiv langsamer als nur pread
sein wird.
Lassen Sie uns die Unterschiede in der Implementierung von beiden in einer Betriebssystemquelle betrachten, die ich zur Verfügung hatte. Ich schneide den exakt gleichen Code aus beiden Funktionen heraus, um die Unterschiede hervorzuheben. Es gibt viel mehr Code als das.
Dies ist Teil 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));
Dies entspricht Teil read
:
return (dofilereadv(p, fd, fp, &iov, 1, 0, &fp->f_offset, retval));
So hat pread
einige zusätzliche Kontrollen, um sicherzustellen, dass wir versuchen, nicht zu versuchen, auf einer Pipe, Fifo, Tty usw. Und es überprüft, dass wir nicht einen negativen Offset von einem Zeichengerät lesen. Es aktualisiert auch nicht den Offset im Dateizeiger (fp
im Code).
es erscheint zweimal lesen, anstatt pread proto – ShinTakezou
Nun, eine Funktion versucht, einen bestimmten Offset vor dem Lesen, während der andere nicht. Sie müssen also entscheiden, ob Sie z. 'lseek' gefolgt von' read' ist besser oder nicht, als nur 'pread' zu verwenden. Eine Möglichkeit, sich zu entscheiden, ist * Benchmark * für Ihren speziellen Anwendungsfall. In der Tat würde ich sagen, es ist der einzige Weg zu entscheiden, und diese Frage ist nicht zu beantworten, weil wir Ihren Anwendungsfall nicht kennen. –
Wirklich, du sorgst dich darum? Der Unterschied ist, wenn es welche gibt, vielleicht 5-6 Taktzyklen. Ein Festplattenzugriff ist _25-30 Millionen_ Taktzyklen ... – Damon