【发布时间】:2010-07-16 17:15:01
【问题描述】:
我在这里得到了一些奇怪的性能结果,我希望 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 );
}
基本上,这段代码会在整个文件范围内进行一百万次随机搜索。当我在 time 下运行它时,对于 smallfile,我会得到这样的结果:
[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-99)。尝试将间隔减小到 0.1% 左右,然后是 0.01% 等,看看您是否注意到任何差异。
标签: c performance libc