zoukankan      html  css  js  c++  java
  • 系统调用之时间开销【转】

    转自:https://blog.csdn.net/lancegentry/article/details/8937514

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/lancegentry/article/details/8937514
            ps:写了很长时间,所以转载请著名作者(程序圆圆圆) !!!还有这句话!!!

            再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," ");
    }
    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 
    ————————————————
    版权声明:本文为CSDN博主「程序圆圆圆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lancegentry/article/details/8937514

  • 相关阅读:
    keepalived 结合mysql 自动切换
    haproxy 配置日志
    haproxy 配置日志
    keepalive的 nopreempt 非抢占
    keepalive的 nopreempt 非抢占
    keepavlied一些参数
    keepavlied一些参数
    mysql 结合keepalived测试
    【转载】[小红猪]11个物理难题,11种基本粒子 分类: 生活百科 2013-07-26 11:04 317人阅读 评论(0) 收藏
    【转载】上帝粒子证实存在宇宙末日来临?(图) 分类: 生活百科 2013-07-26 11:04 336人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/11669841.html
Copyright © 2011-2022 走看看