Почему fseeko () быстрее с гигантскими файлами, чем с маленькими? - PullRequest
4 голосов
/ 16 июля 2010

Я получаю некоторые странные результаты производительности и надеюсь, что кто-то на 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

Я бегал по каждому файлу пару десятков раз, и результаты были единообразными. Поиск в большом файле более чем в два раза быстрее, чем в маленьком файле. Почему?

Ответы [ 2 ]

15 голосов
/ 16 июля 2010

Вы не измеряете производительность диска, вы измеряете, сколько времени потребуется fseek для установки указателя и возврата.

Я рекомендую вам прочитать файл из искомого местоположенияесли вы хотите проверить реальный ввод-вывод.

0 голосов
/ 16 июля 2010

Я бы предположил, что это связано с реализацией fseeko.

Страница man fseek указывает, что она просто «устанавливает индикатор положения файла для указанного потока». Поскольку установка целого числа не должна зависеть от размера файла, возможно, существует «оптимизация», которая будет выполнять автоматическое чтение (и кэширование полученной информации) после fseek для маленьких файлов и не больших файлов.

...