为什么fseeko()使用巨型文件比使用小文件更快?

dic*_*oce 4 c performance libc

我在这里得到了一些奇怪的性能结果,我希望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 );
}
Run Code Online (Sandbox Code Playgroud)

基本上,这段代码在整个文件范围内进行了一百万次随机搜索.当我在时间下运行时,我得到这样的结果为smallfile:

[developer@stinger ~]# time ./seeker ./smallfile

real    0m1.863s
user    0m0.504s
sys  0m1.358s
Run Code Online (Sandbox Code Playgroud)

当我针对9.8 gig文件运行它时,我得到如下结果:

[developer@stinger ~]# time ./seeker ./bigfile

real    0m0.670s
user    0m0.337s
sys  0m0.333s
Run Code Online (Sandbox Code Playgroud)

我对每个文件跑了十几次,结果是一致的.在大文件中查找的速度是在小文件中搜索速度的两倍多.为什么?

Car*_*icz 15

您没有测量磁盘性能,而是测量fseek设置指针和返回所需的时间.

如果你想测试真正的IO,我建议你从你想要的位置读取一个文件.

  • seek()只是您计划从下一个地方读取的操作系统的提示.操作系统具有复杂的调度机制,可以以最小化所有用户的总行程时间的方式移动磁头.由于您的读取与其他人交错,因此直到最后一刻,当操作系统(不是您的程序,操作系统!)将要进行读取时,这是没有意义的.因此,操作系统会将您的搜索位置保留在其脑海中,但在实际物理读取数据之前不会对其进行操作. (4认同)