我在這裏得到了一些奇怪的性能結果,我希望stackoverflow.com上的人可以對此有所瞭解!爲什麼fseeko()比巨型文件更快而不是小文件?
我的目標是一個程序,我可以用它來測試是否尋求大的比小的更貴求的......
首先,我創建了兩個文件由dd'ing的/ dev /零到單獨的文件..一種是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);
}
基本上,這個代碼百萬隨機尋找。當我運行該下的時候,我得到這樣的結果對於小文件:
[[email protected] ~]# time ./seeker ./smallfile
real 0m1.863s
user 0m0.504s
sys 0m1.358s
當我運行它針對9.8演出文件,我得到的結果是這樣的:
[[email protected] ~]# time ./seeker ./bigfile
real 0m0.670s
user 0m0.337s
sys 0m0.333s
我撞上了每個文件幾十次,結果是一致的。在大文件中搜索的速度是在小文件中搜索的兩倍多。爲什麼?
您的搜索分佈非常稀疏:它們都是文件大小的整數百分比值(0-99)。嘗試將間隔降低到0.1%左右,然後再降低0.01%等,看看是否有任何差異。 – casablanca 2010-07-16 17:27:09