Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。

3年前关闭。



Improve this question




以下是readpread的声明:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t pread(int fd, void *buf, size_t count, off_t offset);

我们都知道它们具有几乎相同的功能,但是哪个效率更高?

添加用例:
1.扫描大文件。
2.随机读取一个大文件。

最佳答案

取决于您如何定义“效率”。如果您要询问性能,则差异是微小的。因此,请使用为您解决问题的解决方案。在许多情况下,当您处理从数据库等读取的线程时,pread是唯一的选择。在其他情况下,read是唯一明智的选择。而且这个问题有点不公平,因为preadread做的更多。公平的比较应该是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进行了一些额外的检查,以确保我们不尝试在管道,fifo,tty等上进行搜索。它还检查了是否没有从字符设备读取负偏移。它还不会更新文件指针中的偏移量(代码中的fp)。

关于c - 在read()和pread()之间,哪种方法更有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20560992/

10-11 20:53