大量数据读写:
效率 fgets > scanf > getchar
灵活度相反
小量数据频繁读写,
效率 getchar > scanf > fgets,这里getchar比scanf几乎快一倍,而scanf只比fgets快一点点。
下面是测试的程序,我用 TIMEFORMAT="" time ./test < ~/tmp/bochs-2.4.tar.gz 命令,通过修改scanf和fgets每次读取的字节数(2和1024)来观察fgets,scanf 和 getchar 效率的区别。
明显单位是1024的时候,fgets > scanf > getchar,单位是2的时候,getchar > scanf > fgets。
#include
int main(){
/*
char s[1024];
while(scanf("%2s", s) != EOF)
;
*/
int ch;
while((ch = getchar()) != EOF)
;
/*
char s[1024];
while(fgets(s, 2, stdin) != NULL)
;
*/
}
命令是TIMEFORMAT="" time ./test < ~/tmp/bochs-2.4.tar.gz
bochs-2.4.tar.gz文件总共3.9MB,(环境是vmware, red hat linux 9)
用fgets(s, 1024, stdin)时:
0.00user 0.01system 0:00.01elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (74major+12minor)pagefaults 0swaps
用fgets(s, 2, stdin)时:
0.37user 0.00system 0:00.39elapsed 94%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (74major+12minor)pagefaults 0swaps
用scanf("%1024s", s)时:
0.08user 0.00system 0:00.10elapsed 73%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (79major+12minor)pagefaults 0swaps
用scanf("%2s", s)时:
0.29user 0.02system 0:00.32elapsed 96%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (79major+12minor)pagefaults 0swaps
用ch = getchar()时:
0.13user 0.04system 0:00.18elapsed 91%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (72major+12minor)pagefaults 0swaps