我希望对一个操作文件的算法进行基准测试。该算法迭代N轮,在每一轮中,它读取一个数据块,做一些魔法般的处理,并设置下一个块的偏移量。
这是伪代码:
int run_algorithm(int offset) {
char *fname = "database.dat";
fd = open(fname, O_RDONLY);
// read the desired block to memory
block_size = 1024 * 1024;
char *buf = malloc(block_size);
lseek(fd, offset, SEEK_SET);
read(fd, &buf, block_size);
int new_offset;
// do magic stuff with buf
// and set a new offset
close(fd);
return new_offset;
}
int main() {
int i;
//init offset
int offset = 0;
// iterate N times
for (i = 0; i < N; i++) {
offset = run_algorithm(offset);
}
return 0;
}
我知道操作系统有热缓存和冷缓存。我想要实现冷缓存的情况。在每次运行run_algorithm()时,打开文件时不应该进行任何缓冲。换句话说,我不希望操作系统将文件的一部分存储在内存中以加快open()和seek()的速度。
有没有一种特定的方法可以设置open()和seek()而不进行缓冲?
open()
调用中使用O_DIRECT
吗?这可能会减少系统在写操作期间进行的缓存量。但是你进入了敏感领域,系统将采取非常严格的措施来确保磁盘数据被缓存。 - Jonathan Lefflermain
中打开文件并将FILE *fp
参数传递给run_algorithm
,这样您就不需要重复打开/关闭文件了?您可以将for
循环移动到run_algorithm
中。同时,将一个指向int
的指针(或数组地址)传递给run_algorithm
,并构建一个偏移量数组,让run_algorithm
返回该数组的指针(同时也能够使用作为函数指针传递的数组)。 - David C. Rankin