我在这里获得了一些奇怪的性能结果,我希望stackoverflow.com上的某个人可以对此有所了解!
我的目标是一个程序,我可以用来测试大型搜索是否比小搜索更昂贵......
首先,我通过dd'ing / dev / zero创建了两个文件来分隔文件...一个是1 MB,另一个是9.8gb ...然后我写了这段代码:
#define _LARGE_FILE_API
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main( int argc, char* argv[] )
{
struct stat64 fileInfo;
stat64( argv[1], &fileInfo );
FILE* inFile = fopen( argv[1], "r" );
for( int i = 0; i < 1000000; i++ )
{
double seekFrac = ((double)(random() % 100)) / ((double)100);
unsigned long long seekOffset = (unsigned long long)(seekFrac * fileInfo.st_size);
fseeko( inFile, seekOffset, SEEK_SET );
}
fclose( inFile );
}
基本上,这段代码在整个文件范围内进行了一百万次随机搜索。当我按时运行时,我会得到这样的小文件结果:
[developer@stinger ~]# time ./seeker ./smallfile
real 0m1.863s
user 0m0.504s
sys 0m1.358s
当我针对9.8 gig文件运行时,我得到如下结果:
[developer@stinger ~]# time ./seeker ./bigfile
real 0m0.670s
user 0m0.337s
sys 0m0.333s
我对每个文件跑了十几次,结果是一致的。在大文件中查找的速度是在小文件中搜索速度的两倍多。为什么呢?
答案 0 :(得分:15)
您没有衡量磁盘性能,而是衡量fseek
设置指针并返回所需的时间。
如果您想测试真实的IO,我建议您从您正在寻找的位置读取文件。
答案 1 :(得分:0)
我认为它与fseeko
的实现有关。
fseek
的手册页表示它只是“设置指示流的文件位置指示符”。由于设置一个整数应该与文件大小无关,因此可能存在一个“优化”,它将在fseek之后对小文件而不是大文件执行自动读取(并缓存结果信息)。