我遇到了这样一种情况,即lseek
在每次搜索之间重复转发并读取一个小块(300-500 字节)似乎比read
从头开始遍历整个文件并忽略我没有的字节要慢不想。即使我只进行 5-10 次搜索,这似乎也是正确的(所以当我最终只读取约 1% 的文件时)。我对此感到有些惊讶——为什么重复向前搜索,这应该涉及更少的工作,比读取实际上必须将数据从内核空间复制到用户空间的读取速度要慢?
大概在本地磁盘上查找操作系统时,甚至可以向驱动器发送消息以进行查找,而无需通过总线将任何数据发送回,从而节省更多费用。但是我正在访问一个网络挂载,我希望读取比查找慢得多(发送一个数据包说提前移动 N 个字节而不是实际通过网络传输数据)。
无论是从本地磁盘读取还是从网络文件系统读取,这怎么可能发生?我唯一的猜测是操作系统在我寻找的每个位置之后都会预取大量数据。这是通常会发生的事情还是可能表明我的代码中有错误?