改章节朋友在青岛吃饭的时候突然想到的...今天就有想写几篇关于代码系统的文章,所以回家到之后就奋笔疾书的写出来发表了
ps:写了很长时间,所以转载请著名作者(lancegentry) !!!还有这句话!!!
再ps一个:转载注明本空间地址呀!!!http://blog.csdn.net/lancegentry/article/details/8937514
一个程序应用系统调用的次数会很大程度上影响系统的性能,因为在执行系统时,会从用户代码切换执行内核代码,然后返回用户代码。优化手腕就是尽量增加系统调用。一下实验用来验证系统会付出伟大d呃开销,所用时间与电脑配置、所用的系统的内核有关,故在不同的电脑或统一电脑的不同系统上会有一些差异,但是结果一定是雷同的。
本人应用的系统是Mac OS X 10.8.3 。
1.首先我们建立一个约1Mb的文件(file.in)用于测试。建立代码如下,当然方法有很多这只是其中的一种。
#include <stdio.h> #include <stdlib.h> int main() { FILE *file; file = fopen("file.in", "w"); int i = 0xfffff; while (i--) { fprintf(file,"%c",i%26 + 'a'); if (i%26 == 0) fprintf(file,"\n"); } exit(0); }
2.
然后编译copy_system.c
#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main() { char c; int in, out; in = open("file.in", O_RDONLY); out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while (read(in,&c,1) == 1) write(out,&c,1); exit(0); }
上述代码中要注意的是#include <unistd> (unix standard)要放在第一行,因为它定义的POSIX规范的有关标志可能会影响其他的头文件。
我们可以看一下运行的结果
这里我们首先看到有一个1.0M的文件file.in。然后喔们编译了copy_system.c,之后应用time命令查看执行时间。
3.编译copy_system2.c
#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #define BLOCK 1024 int main() { char block[BLOCK]; int in, out; int nread; in = open("file.in", O_RDONLY); out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while ((nread = read(in,block,sizeof(block))) > 0) write(out,block,nread); exit(0); }
这里我们通过复制数据块的方法来增加系统调用(每次复制1K),看看结果(顺道验证刚才文件确切生成了。。。)
我把上一次的执行也截取了上去以便比较,现在我们可以看到时间差距还是非常明显了,我们这是增加约2000次(2048)的系统调用所节俭的时间。并且我们看到这两个程序执行时间的差距还是伟大的。那么是否是越大越好呢?
为了实验放便我们将 copy_system2.c中的#define BLOCK 1024删除即为上面代码
#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main() { char block[BLOCK]; int in, out; int nread; in = open("file.in", O_RDONLY); out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while ((nread = read(in,block,sizeof(block))) > 0) write(out,block,nread); exit(0); }
这样我们就可以很便利的停止实验了。实验结果如下
这里我们应用 -Dname=value 的命令选项在编译时定义BLOCK变量。因为我应用的是64位系统所以在前期这个时间照旧在有减小的趋势,不过可以看出在256后这个值已经变更很小了。在1024后这些值开始了摆动,并且失去了之前的规律(system time每次减小一倍,2048和4096的数据(倒数第3个和倒数第1个))。这是因为硬件会限制对底层系统调用一次能读写的数据块大小。
最后希望大家能从本文中有所收获。2013.05.16 23:00
End
文章结束给大家分享下程序员的一些笑话语录:
女人篇
有的女人就是Windows虽然很优秀,但是安全隐患太大。
有的女人就是MFC她条件很好,然而不是谁都能玩的起。
有的女人就是C#长的很漂亮,但是家务活不行。
有的女人就是C++,她会默默的为你做很多的事情。
有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
有的女人就是SQL,她会为你的发展带来莫大的帮助。