c语言分别用库函数和系统函数来进行文件操作效率对比

使用库函数来进行文件读取

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

int main(void)
{
  FILE *fp, *fp_out;
  int n;
  
  fp = fopen("dict.txt", "r");
  if (fp==NULL){
    perror(fopen error);
    exit(1);
  }
  
  fp_out = fopen("dict.cp", "w");
  if (fp_out ==NULL){
    perror("fopen error");
    exit(1);
  }
  
  while((n=fgetc(fp))!=EOF){
    fputc(n, fp_out);
  }
  
  fclose(fp);
  fclose(fp_out);
  
}

# 编译好之后直接运行速度非常快

使用系统调用

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#define N 1

int main(int agrc, char *argv)
{
  int fd, fd_out;
  int n;
  char buf[N];
  
  fd = open("dict.txt", O_RDONLY);
  if (fd<0){
    perror("open dict.txt error");
    exit(1);
  }
  
  fd_out = open("dict.cp", O_WRONLY|O_CREAT|O_TRUNC, 0644);
  if (fd_out < 0 ){
    perror("open dict.cp error");
    exit(1);
  }
  
  while((n=read(fd, buf, N))){
    if (n<0){
      perror("read error");
      exit(1);
    }
    write(fd_out, buf, n);
  }
  
  close(fd);
  close(fd_out);
 
  return 0;
}

# 很明显速度要比库函数调用要慢的多

为什么系统调用要比库函数效率要低

  • 使用strace可以详细看到运行的调用结果,发现调用的次数要少的多
  • 内核缓存有4096字节的大小
  • 用户空间进入内核空间要耗时比较多,但是比内核到磁盘要快

  • fputc 中有一个字节的缓存区,达到4096之后在会进入到内核空间中
  • read write是属于无用户级缓存
posted @ 2020-03-18 16:38  FANDX  阅读(469)  评论(0编辑  收藏  举报