2009-09-29 75 views
2

我首先要承认这是一个类项目,因为它会很明显。我们应该读取以探测文件系统的块大小。我的问题是,这样做的时间似乎是线性增加,没有像我所期望的步骤。探测文件系统块大小

我定时读这样的:

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

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

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

+0

你想要给出块大小的东西,或者改进实验以从时间猜测块大小的建议吗? – 2009-09-29 18:52:48

+0

我想我正在寻找实验性帮助。我无法让C做I/O所需的工作。 – plor 2009-09-29 22:48:37

+0

检出fcntl(..,F_NOCACHE,..)以完全禁用缓存。 – rpj 2011-02-25 03:15:27

回答

1

您可能需要使用系统调用(open()read()write(),...) 直接减少由FILE*东西做缓冲的影响。 另外,您可能想要以某种方式使用同步I/O。 一种方法是打开O_SYNC标志集 (或O_DIRECT根据ephemient的回复)打开文件。 引述的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))或使用所述chattr(1)命令中的文件设置S属性。

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)会尽量让你绕过内核的缓存(不保证)。

+0

谢谢,我需要生成一个图表,我可以指向某个指示块边界的东西。如果它适合我​​,我会尝试这个并接受它。 – plor 2009-09-29 17:45:04