//程序B #include "stdio.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "string.h" #define N 100000 void main(){ char * s="Hello World\n"; FILE* file=fopen("/tmp/tmp2.out","w"); setbuf(file,NULL); for(int i=0;i<N;i++) fprintf(file,s); fclose(file); }这个程序为什么慢
时间: 2023-07-19 19:24:37 浏览: 87
这个程序比较慢的原因是因为它在写入文件时禁用了缓冲区,每次写入都需要直接访问磁盘,而磁盘IO是比较慢的操作。这样,每写入一次数据就需要进行一次IO操作,总共需要进行 100000 次IO操作,所以程序运行时间比较长。
如果启用了缓冲区,C库会将数据暂时保存在内存中,等到缓冲区满了或者调用 `fflush` 函数时才将其写入磁盘。这样可以减少磁盘IO操作的次数,提高写入效率。所以,在这个程序中,如果使用 `setbuf(file, buf)` 函数启用缓冲区,可以提高运行效率。例如:
```c
//程序B
#include "stdio.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "string.h"
#define N 100000
void main(){
char * s="Hello World\n";
FILE* file=fopen("/tmp/tmp2.out","w");
char buf[BUFSIZ];
setbuf(file, buf);
for(int i=0;i<N;i++)
fprintf(file,s);
fclose(file);
}
```
在这个版本的程序中,使用了 `setbuf(file, buf)` 函数,将文件流 `file` 与一个大小为 `BUFSIZ` 的缓冲区 `buf` 关联起来。这样,在写入文件时会先将数据保存到缓冲区中,等到缓冲区满了或者调用 `fflush` 函数时才将其写入磁盘,从而提高了写入效率。
阅读全文