【发布时间】:2017-09-27 01:40:51
【问题描述】:
fseek 是否有任何性能开销?例如,fseek 调用是否实际上要求内核移动磁盘头?
另外,fseek 性能成本是否与它所寻求的“距离”有什么关系?例如,fseek(1byte) 与fseek(100Mb) 与fseek(文件结束)。
【问题讨论】:
-
这真的取决于底层。文件系统、物理介质等。实际上它不需要做任何事情,除了改变内存中的一些数字。之后的实际读/写才是最重要的。
-
它很可能可以忽略不计,与寻求距离无关,但您不会得到任何明确的答案。你能做的最好的就是自己测量它,即使那样,你也不能保证你将在你的系统上测量的东西会接近你在另一个系统中测量的东西。 (但它很可能普遍可以忽略不计。无论距离如何。)
-
在几乎所有类型的设备上,开销都可以忽略不计。
-
当然,磁盘磁头只会移动到尚未缓冲/缓存的实际读取。如果您在没有实际读取的情况下发出多个
fseek指令,为什么磁盘磁头会移动? -
fseek()调用存在隐含成本 - 如果FILE *处于写入模式,则与受影响的FILE *关联的任何缓冲区都可能会被刷新,如果处于读取模式,则可能会失效。 IO 模式(例如随机小读取)可能会导致显着的额外读取开销,因为每个fseek()/read 周期都会重新填充缓冲区。fseek()的“距离”和性能影响可能很重要,也可能不重要。这将取决于页面缓存命中以及磁盘磁头必须移动的距离。这取决于很多很多事情。
标签: c linux file linux-kernel kernel