我首先承认这是一个类项目,因为它很明显。我们应该做读取来探测文件系统的块大小。我的问题是,这样做的时间似乎呈线性增长,没有像我期望的那样的步骤。
我按照这样的时间计时:
double startTime = getticks();
read = fread(x, 1, toRead, fp);
double endTime = getticks();
getticks使用rdtsc指令。我恐怕有缓存/预取导致读取在fread期间不花时间。我尝试在每次执行程序之间创建一个随机文件,但这并没有减轻我的问题。
准确测量从磁盘读取所用时间的最佳方法是什么?我很确定我的块大小是4096,但我怎样才能获得数据来支持它?
答案 0 :(得分: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)
会试图让你绕过内核的缓冲区缓存(不保证)。
答案 1 :(得分:1)
您可能希望使用系统调用(open()
,read()
,write()
,...)
直接减少FILE*
内容所做缓冲的影响。
此外,您可能希望以某种方式使用同步I / O.
一种方法是使用O_SYNC
标志设置打开文件
(或根据ephemient的回复O_DIRECT
)。
引用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))或使用S
(1)命令在文件上设置chattr
属性