• 代码系统[置顶] 系统调用之时间开销


    改章节朋友在青岛吃饭的时候突然想到的...今天就有想写几篇关于代码系统的文章,所以回家到之后就奋笔疾书的写出来发表了

                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,她会为你的发展带来莫大的帮助。

  • 相关阅读:
    Redis持久化
    Windows Phone中扩展WebBrowser使其支持绑定html内容
    使用MVVM-Sidekick开发Universal App(二)
    使用MVVM-Sidekick开发Universal App(一)
    在Windows Phone 8中使用Live Connect并保持登陆状态
    iOS 打印结构体
    CGAffineTransformMake 矩阵变换 的运算原理(转)
    二维码快速扫描工具
    微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常(转)
    UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释(转)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3084518.html
Copyright © 2020-2023  润新知