fseek
会有性能开销吗?比如,fseek
调用是否实际请求内核移动磁盘头?
此外,fseek
的性能成本与其所寻求的位置有关吗?例如,fseek(1byte) v.s. fseek(100Mb) v.s. fseek(end-of-file)。
fseek
会有性能开销吗?比如,fseek
调用是否实际请求内核移动磁盘头?
此外,fseek
的性能成本与其所寻求的位置有关吗?例如,fseek(1byte) v.s. fseek(100Mb) v.s. fseek(end-of-file)。
它也可以反过来工作。如果您要查找的文件部分恰好在缓存中(因为之前有东西访问过它),内核可以直接从缓存中获取,而无需访问硬盘。
当然,对于SSD、tmpfs等文件,磁头移动是无关紧要的。
此外,fseek的性能成本是否与其“寻找”的距离有关?例如,fseek(1byte)与fseek(100Mb)与fseek(end-of-file)。
可能影响不大。
fseek()
调用的目标位置在与FILE *
相关联的已读数据的任何用户空间缓存中,则在读模式下可能甚至不会做到这一点。 - Andrew Henle
fseek
指令而没有实际读取,为什么磁盘头会移动呢? - Weather Vanefseek()
调用存在隐含的成本 - 如果FILE *
与之相关联的缓冲区处于写模式,则该缓冲区可能会被刷新,如果处于读模式,则可能会被使无效。诸如随机小读取之类的 IO 模式很可能会导致显着的额外读取开销,因为每个fseek()
/读取周期都需要重新填充缓冲区。fseek()
的“距离”和性能影响可能重要,也可能不重要。这将取决于页面缓存命中以及磁盘头移动的距离。这取决于许多,许多事情。 - Andrew Henle