如果我有 C 代码
off_t off = ftello(f);
fseeko(f, some_location);
// do some work
fseeko(off);
第二个 fseeko 和第一个一样慢吗?我原以为文件 block 总是被缓存,所以第二个可能会快得多。
在我在 Linux 上的分析结果中,第二个 fseek 花费了类似的成本。这是预期的吗?
最佳答案
在大多数实现中,fseek
调用几乎是免费的,因为它所做的只是设置 FILE
对象中的位置。实际读取数据时会产生费用。此时,重新读取已读取的 block 很可能会受益于缓冲区高速缓存。但操作系统也很可能正在进行推测性预读,以便最近读取的 block 后面的 block 也在缓冲区缓存中(第二次查找时可能会出现这种情况)。
对于写入来说,测量时间甚至更加复杂,因为写入的 block 不一定会立即提交到永久存储;一旦数据被复制到缓冲区缓存中,write
系统调用就会返回。
关于c - fseek 返回先前位置会比查找新位置更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44594060/