使用fread()和read()读取大块的有效性

时间:2012-02-27 23:50:35

标签: c performance system fread

  

可能重复:
  speed comparison between fgetc/fputc and fread/fwrite in C

假设我想通过以下方式实现fread()来读取大量数据:

FILE *fp;
double * dataBuffer;
int fileSize;

fileSize = 8 * 128 * 500001;
fp = fopen ( "binaryData.dat", "rb" );

dataBuffer = (double*) malloc (fileSize);
fread (dataBuffer,fileSize,1,fp);
fclose (fp);

根据

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

fread()将对 fileSize 调用fgetc(),以便将来自文件的所有数据(我假设我知道手头的文件大小)存储到缓冲区(的DataBuffer )。现在根据:

http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html

fgetc()每次调用只读取一个字节。 fgetc()究竟是如何读取这些字节的(逐个)? fgetc()在某些时候执行系统调用read()来从文件中读取一个字节吗?换句话说,是fread()使 fileSize 读取()系统调用吗?

我读过fread()是有效的(或者可以有效地使用),因为它使用缓冲流。但是我不知道如果它仍然使用read()一次读取一个字节,那会有什么影响。

我现在更可能没有任何意义,但那是因为我对这个问题感到困惑;这就是我在这里发帖的原因。也许提出这个片段更有意义

FILE *fp;
double * dataBuffer;
int fileSize, fd;

fileSize = 8 * 128 * 500001;
fp = fopen ( "binaryData.dat", "rb" );
fd = fileno(fp);

dataBuffer = (double*) malloc (fileSize);
read(fd, dataBuffer, fileSize);
fclose (fp);

在这段代码中,我实际上执行相同的任务,但使用read()代替。我对这个片段的一个问题是我的代码中的read语句;因为我在read语句中指定读取 fileSize 字节,这会导致 fileSize 单个系统调用读取一个字节,或只是一个系统调用来读取一个块中的> fileSize 字节?数据是直接存储到dataBuffer中,还是先将其存储到中间OS缓冲区中然后复制到dataBuffer中?

最终,我要问的是哪些代码片段能够更有效地加载如此大量的数据。我知道有其他帖子说在大多数情况下fread更有效,但我不能理解为什么(至少在我的情况下)。

由于

0 个答案:

没有答案