小编ral*_*lfg的帖子

为什么缓冲写入fmemopen()'ed FILE比无缓冲?

当然,磁盘上的文件缓冲I/O比无缓冲的速度快.但是为什么即使写入内存缓冲区也有好处?

以下基准代码示例使用gcc 5.40编译,使用优化选项-O3,与glibc 2.24链接.(请注意,常见的glibc 2.23有关于fmemopen()的错误.)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>

int main() {
  size_t bufsz=65536;
  char buf[bufsz];
  FILE *f;
  int r;

  f=fmemopen(buf,bufsz,"w");
  assert(f!=NULL);

  // setbuf(f,NULL);   // UNCOMMENT TO GET THE UNBUFFERED VERSION

  for(int j=0; j<1024; ++j) {
    for(uint32_t i=0; i<bufsz/sizeof(i); ++i) {
      r=fwrite(&i,sizeof(i),1,f);
      assert(r==1);
    }
    rewind(f);
  }

  r=fclose(f);
  assert(r==0);
}
Run Code Online (Sandbox Code Playgroud)

缓冲版本的结果:

$ gcc -O3 -I glibc-2.24/include/ -L glibc-2.24/lib  test-buffered.c 
$ time LD_LIBRARY_PATH=glibc-2.24/lib ./a.out
real    0m1.137s
user    0m1.132s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

无缓冲版本的结果

$ gcc -O3 -I glibc-2.24/include/ -L glibc-2.24/lib …
Run Code Online (Sandbox Code Playgroud)

c stdio

9
推荐指数
2
解决办法
660
查看次数

标签 统计

c ×1

stdio ×1