Closed. This question needs to be more focused。它当前不接受答案。
想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
3年前关闭。
Improve this question
以下是
我们都知道它们具有几乎相同的功能,但是哪个效率更高?
添加用例:
1.扫描大文件。
2.随机读取一个大文件。
这是
因此,
想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
3年前关闭。
Improve this question
以下是
read
和pread
的声明:#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
是唯一明智的选择。而且这个问题有点不公平,因为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
进行了一些额外的检查,以确保我们不尝试在管道,fifo,tty等上进行搜索。它还检查了是否没有从字符设备读取负偏移。它还不会更新文件指针中的偏移量(代码中的fp
)。关于c - 在read()和pread()之间,哪种方法更有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20560992/
10-11 20:53