Linux文件操作学习:系统调用和标准I/O库
|
五、系统调用与标准I/O的性能比较 就拿本例子中的代码来比较,两个例子编译后生成的可执行文件的文件名分别为:copy_system.exe和copy_stdio.exe,在Linux下用time命令来测试其运行时间如下:
从测试结果可以看出,系统调用的效率比库函数要低很多。为什么呢? 因为使用系统调用会影响系统的性能。与函数调用相比,系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码,所以系统调用的开销要比普通函数调用大一些。然而也是有办法减少这种开销的,就是在程序中尽量减少系统调用的的次数,并且让每次系统调用完成尽量多的工作。 而库函数为什么做同样的事情效率却会高这么多呢?这是因为库函数在数据满足数据块长度(或buffer长度)要求时才安排执行底层系统调用,从而减少了系统调用的次数,也让每次的系统调用做了尽量多的事情,所以效率就比较高。 六、提高系统调用的简单方法举例 用回每一个例子(coy_system.c)的代码,略加修改就能提高我们的效率,例如一次读1024个字节,修改后保存文件名为copy_system2.c,代码如下:
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
char buff[1024];
int in = -1, out = -1;
int nread = 0;
in = open("Data.txt", O_RDONLY);
out = open("copy_system2.out.txt", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
//一次读写1024个字节
while((nread = read(in, buff, sizeof(buff))) > 0)
write(out, buff, nread);
close(in);
close(out);
return 0;
}
生成的可执行文件为copy_system2.exe,使用time命令查看其执行时间,如下:
比较下可以看出,其性能改善了一个数量级,其效率甚至比用库函数一个一个字符复制来来得高效,至少在我的机子上是这样。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



