2

我首先要承认这是一个课堂项目,因为它很明显。我们应该进行读取以探测文件系统的块大小。我的问题是执行此操作所需的时间似乎呈线性增加,没有像我预期的那样采取任何步骤。

我正在计时这样的阅读:

double startTime = getticks();
read = fread(x, 1, toRead, fp);
double endTime = getticks();

getticks 使用 rdtsc 指令的地方。恐怕有缓存/预取导致读取在 fread 期间不需要时间。我尝试在每次执行我的程序之间创建一个随机文件,但这并不能缓解我的问题。

准确测量从磁盘读取所用时间的最佳方法是什么?我很确定我的块大小是 4096,但是我怎样才能获得支持它的数据呢?

4

2 回答 2

2

确定文件系统块大小的常用方法是询问文件系统它的块大小是多少。

#include <sys/statvfs.h>
#include <stdio.h>
int main() {
    struct statvfs fs_stat;
    statvfs(".", &fs_stat);
    printf("%lu\n", fs_stat.f_bsize);
}

但是如果你真的想要,open(…,…|O_DIRECT)还是posix_fadvise(…,…,…,POSIX_FADV_DONTNEED)会尝试让你绕过内核的缓冲区缓存(不保证)。

于 2009-09-29T17:38:25.080 回答
1

您可能希望直接使用系统调用 ( open(), read(), , ...) 来减少这些东西write()所做的缓冲的影响。FILE*此外,您可能希望以某种方式使用同步 I/O。一种方法是打开带有O_SYNC标志集的文件(或O_DIRECT根据 ehemient 的回复)。引用 Linux open(2) 手册页:

   O_SYNC The file is opened for synchronous I/O.  Any  write(2)s  on  the
          resulting  file  descriptor will block the calling process until
          the data has been physically written to the underlying hardware.
          But see NOTES below.

另一种选择是使用-o sync(参见mount(8))挂载文件系统或使用(1)命令设置S文件的属性。chattr

于 2009-09-29T19:45:30.270 回答