狂自私

导航

一秒钟,你的电脑能数多少数?

如题,让电脑数数很简单,一个循环就能够搞定,但是如何是在一秒内完成?我们需要一个定时的东西定时器函数:alarm();

原型:unsigned int alarm(unsigned int seconds);

返回值:0或者剩下的秒数;无失败返回,即,几乎不出错。

常用于定时(废话),取消前一个定时器。定时器叼啊,自然定时法不管进程是个啥情况(僵尸,就绪,运行,挂起,阻塞,暂停,终止)都计时。

上代码:

#include <unistd.h>

#include <stdio.h>

int main(void)

{

    unsigned int i = 0;

    alarm(1);//定时,调用之后不会在定时结束之前影响CPU执行程序。

    while (1)

    {

        printf("%d\n", i++);

    }

    return 0;

}

来看看结果:因为我的Linux是win10子系统,不是一个真正的系统。上面代码编译的结果执行之后的结果,数数数到了2500左右,用time查看一下:time ./a.out

real是执行程序所用总时间,因为alarm函数的精确度是秒级,所以不是一秒也比较正常。user是程序在用户空间执行的总时间;sys是程序在内核中执行的时间。我们简单的计算一下就知道,user + sys != real;差的很远很远,对于计算机来说。这是为什么?难道alarm函数错了?不是;是time错了?不是;或者程序执行的时候没有抢到CPU资源被其他进程耽搁了?也不是,time只计算当前程序执行总时间。

我们先看看程序实际执行时间的计算公式:实际执行时间=在系统空间执行时间+在用户空间执行时间+等待时间;等待时间?等待什么?CPU资源、内存、缓存、其他的系统资源等;所以,通过上面的图片结果和刚刚说的公式,我们知道,等待时间占用了程序执行时间的绝大部分。那么,这里的这个程序子啊等待什么?它在等待硬件资源:系统I/O,屏幕。我们的每一个结果都要输出到屏幕上,这调用了很多的系统I/O。这玩意最费时间。那我们该怎么优化?

既然打印到屏幕很费时间,那么我们就不让它打印了呗,我们重定向涩。我们这样写命令:time ./a.out > a.txt    执行之后的结果:,现在的user + sys ==real (大约)。这也证实了,调用io真的很费时间。我第一次执行的时候竟然只给我数了500多。当时就觉得我的电脑是个水货。写这篇博客的时候倒是给我面子,数到两千多。

现在我们打开文件a.txt查看,不要用cat,不要用cat,不要用cat,重要的事说三遍。cat也调用io啊,一个一个的读再打印。我们就直接用vi打开,然后CTRL+end跳到最后就是了。

结果:。我的电脑可能有他自己的想法,我不写博客的时候就两百多万,现在写博客给我翻倍?爱面子是不?这里的差距是好多倍啊,两千多直接到四百五十万。所以啊,这里就给我们一个启发:以后有能力做软件性能优化的时候啊,首选io优化

posted on 2018-04-05 20:42  狂自私  阅读(613)  评论(0编辑  收藏  举报