Я получаю здесь некоторые странные результаты производительности, и я надеюсь, что кто-то на stackoverflow.com может пролить свет на это!
Моей целью была программа, которую я мог бы использовать для проверки того, были ли большие запросы дороже, чем маленькие...
Во-первых, я создал два файла с помощью dd'ing /dev/zero для разделения файлов... Один размером 1 МБ, другой 9,8 ГБ... Затем я написал этот код:
#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 );
}
По сути, этот код выполняет один миллион случайных поисков по всему диапазону файла. Когда я запускаю это вовремя, я получаю такие результаты для smallfile:
[developer@stinger ~]# time ./seeker ./smallfile
real 0m1.863s
user 0m0.504s
sys 0m1.358s
Когда я запускаю его с файлом размером 9,8 гигабайта, я получаю такие результаты:
[developer@stinger ~]# time ./seeker ./bigfile
real 0m0.670s
user 0m0.337s
sys 0m0.333s
Я запускал каждый файл пару десятков раз, и результаты совпадают. Поиск в большом файле более чем в два раза быстрее поиска в маленьком файле. Почему?