你的程序运行使用了多少CPU,秒知!



朋友们,相信大家日夜操练,代码已经撸了不少了,在跟代码打交道的时候,大家有没有思考过一个问题,想过你的代码完成一个循环或者处理其它事件它到底花了多少时间吗?

“什么,你不是装逼吧,居然还可以知道代码运行所花的时间?”

--“没错!”,我通常会假装斯文的深吸一口中华后,意味深长的说。

。。。。。。

既然装了,就是要解释清楚的。下面,我就跟大家普及普及,讲得不好,萝卜青菜滴不要,请大家猛戳死我!

大家都知道,任何计算机的硬件里都有 CPU这玩意,这哥们可不是来装逼的,它的全称是中央处理器(Central Processing Unit ),既然是带了“中央”头衔,作用也是霸气滴不行,如下:

  • 处理指令,控制程序中指令的执行顺序。程序中的各指令之间是有严格顺序的,必须严格按程序规定的顺序执行,才能保证计算机系统工作的正确性。
  • 执行操作,一条指令的功能往往是由计算机中的部件执行一系列的操作来实现的。CPU要根据指令的功能,产生相应的操作控制信号,发给相应的部件,从而控制这些部件按指令的要求进行动作。比如,在控制台显示“ Hello World”!
  • 控制时间,时间控制就是对各种操作实施时间上的定时, 比如:不同程序对应的指令什么时候开始执行,执行多久?在一条指令的执行过程中,在什么时间做什么操作均应受到严格的控制。只有这样,计算机才能有条不紊地指挥众多的应用程序和硬件工作。
  • 处理数据,主要是对数据进行算术运算和逻辑运算。

好!霸气侧漏的东西自然有它霸气的理由!由于涉及到的信息量巨大,为了不太为难大家的脑袋上扛着的这块“CPU”,今天我只讲讲我们CPU和时间的话题。要搞清楚这个话题,我们需要来点前戏:

我们电脑装了这么多应用程序,很多程序可以同时执行。比如:你可以一边看着小视频,一边聊着QQ,同时你的迅雷还在下载着其他的小视频,这些老爷机(请原谅我把以前只有一块CPU的电脑称之为老爷机)只用一块CPU是怎么做到呢?

答案在此 :操作系统(Windows、Unix 和Linux等)会把CPU进行微秒(1微妙 = 0.000001秒)级别的分片,称之为时间片,即微观上CPU分配给各个程序运行的时间,每个应用程序被分配一个极短的时间段让CPU控制其运行,这个时间段称作它的时间片,即该进程此次允许运行的时间,然后,这些应用程序在规定的时间片内运行,一旦时间结束,就马上切换给下一个程序运行,因为时间片被划分在微妙级别,所以,以我们常人这种0.2秒的反应速度看来,电脑上的程序宝宝们是同时进行的。(注:如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理某个应用程序的一小部分,如何做到对所有应用程序处理公平,主流方法就是引入时间片,每个程序轮流执行。)

好!搞清楚了时间片的概念,接下来就好理解程序完成一个循环或者处理其它事件所花的时间这个概念了,没错,它就是指 CPU 用来执行这段代码所花的时间片之和!

比如下面这段代码:

for(int i=0; i<10000; i++) ;

假设CPU运行这段代码,被分成10个时间片才能运行完,每个时间片是1微秒,那么真正所花在运行代码上的CPU时间是:10 x 1 = 10 微秒

好!说到这里,很多同学可能会大声叫好!终于理解这个概念了!Martin 牛逼,Martin 威武!Martin xxx xxx

但是,如何获得这个时间,难道要自己取算吗?

不会! C库已经帮我们准备了一个函数,它就是计时函数是clock(),声明如下:

#include <time.h>

clock_t clock(void);

描述:

clock() 函数精确的返回当前程序已运行的的CPU时间。如果要换算成秒,需要将返回的结果除以 CLOCKS_PER_SEC 的值,如果获取失败,则返回 -1.

在这里,有的朋友可能会吓一跳,clock_t 是啥,请原谅我还是个小白呀!!!

其实,它只是个长整形数,和long 一样一样滴! 为什么,你学会了使用typedef 自定义类型,一切都不会再感到惊讶,它其实就是:

typedef long clock_t;

或许大家另外还会有个疑问,CLOCKS_PER_SEC 又是什么?那么我来告诉大家,这玩意定义在time.h文件中,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

它意味着,每过千分之一秒(1毫秒),我们调用clock()函数返回的值就加1。

到次为止, 大家应该就知道该怎么玩耍了吧?还不懂? 来一段代码带大家理解一下, 下面的代码带大家获取你的机器运行1千万次 -- 操作所花的时间:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <unistd.h>

int main(void)

{

     long  times = 10000000L;

     clock_t start, end;

     double    duration;

     /* 测量一个事件持续的时间*/

     printf( "执行 %ld 次循环 -- 操作所花的时间: ", times );

     start = clock();

     /* 程序先休息两秒,这时候不消耗CPU时间 */

     usleep(2000000);

     while( times-- ) ;

     end = clock();

     duration = (double)(end - start) / CLOCKS_PER_SEC;

     printf( "%f 秒\n", duration );

     system("pause");

     return 0;

}

在我笔记本上运行的结果是:

大家也可以在你们的电脑是执行下,看看你们的笔记本是否可以可以甩我一条街!

原文地址:https://www.cnblogs.com/51bc/p/10274973.html

时间: 2024-10-12 15:18:17

你的程序运行使用了多少CPU,秒知!的相关文章

苹果IOS,与windows Phone7,系统,内存,CPU处理,及后台程序运行,详解微软墓碑机制的系统

关于ios的多任务以及内存管理 看了很多人为自己的可用内存是350mb还是380mb纠结.为了多优化出一点可用内存费脑筋. ios的任务管理和内存管理,跟windows是有很大差别的.很多人习惯于用 windows的思维去看待ios. windows大家都知道,窗口开的越多,系统越慢,为什么呢?因为所有窗口都在运行,cpu占用率高:并且都占内存.可用内存不足还会迫使系统使用硬盘充当虚拟内存,硬盘频繁读写当然会多耗电,并且硬盘速度也比较慢. ios则不同.首先ios的后台任务,除了极少数可以后台运

【计算机概论】数据表示方式与软件程序运行

数据表示方式 数字系统 本质即二进制与十进制的相互转换. 文字编码系统 常用的英文编码表为ASCII系统,这个编码系统中,每个符号(英文,数字或符号等)都会占用1B的记录. 中文当中的编码系统最常用的是big5(简体是GB2312)编码表.每个中文字符占用2B. 为了解决某些生僻字被识别成乱码的问题,由国际组织ISO/IEC指定了所谓的Unicode编码系统,即UTF8或统一码,从而打破了所有国家的不同编码. 软件程序运行 目前的计算机系统将软件分为两大类,一个是系统软件,一个是应用程序. 机器

C程序运行的背后(2)

话说上回说到,C程序运行之前,必须要加载到其进程地址空间中.今儿咱就扯扯这个加载到底是怎么加载的. 一图胜前言,这个图简单说明了可执行文件加载过程的逻辑流,在此只做粗粒度概要说明.需要准确描述的,请出门左转,看源码去吧. 1.  程序总是运行在进程上下文(context)中的,当输入./memlayout时,shell会创建一个子进程.除每个进程独有的专属信息外,子进程会继承父进程的大部分资源,如环境变量.进程空间映像等.也就是说,如果不重置子进程的内容,子进程会运行与父进程一样的程序.为了让子

2.C语言------程序运行为什么需要内存2

C语言------程序运行为什么需要内存(二) 1.代码就是函数.C语言中全局变量和局部变量就是数据. 2.在运行应用程序时,所有应用程序的代码和数据都在DRAM中就是冯诺依曼结构. 3.在单片机中将程序烧写到Flash(NorFlash)中,然后程序在Flash中运行.如果程序运行过程中不需要处理数据,那么这个这个程序也就不需要内存.程序中涉及到的数据(全局变量或局部变量)不能再Flash中必须放到RAM(SRAM:内存)中.CPU从Flash中读取程序并运行该程序,Flash中的程序只会被读

栈帧 --- 程序运行中数据的更改问题

一.栈 栈作为一种特殊的数据结构而存在("后入先出"存储),是一种只能在一端进行插入和删除操作的特殊线性表. 大多数CPU上的程序实现使用栈来支持函数调用操作.栈用来传递函数参数.存储返回信息.临时保存寄存器原有值以用于回复以及存储局部数据. 栈有很多自己的特性,它具有记忆功能,对栈的插入与删除操作中,不需要改变栈底指针:而且栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.因此栈作用就是用来保持栈帧的活动记录(即函数调用).

Java程序运行机制及运行过程

Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运行平台的差别,真正实现了“一次编译,随处运行”. Java垃圾回收(Garbage Collection):不用使用的内存空间应该回收:在C/C++等语言中,由程序员负责回收无用的内存:Java语言消除了程序员回收无用内存的职 责,它提供一种系统级线程跟踪存贮空间的分配情况,并在JVM空闲的时候,检

java入门(1) 程序运行机制及运行过程

首先我们来看一下java程序在底层是怎么工作的: JAVA有两种核心机制: Java虚拟机(Java Virtual Machine): 1.java虚拟机可以理解成一个以字节码为机器指令的CPU. 2.对于不同的平台,有不同的虚拟机. 3.java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”. 垃圾收集机制(Garbage collection) 1.不再使用的内存空间应回收——垃圾收集 2.Java语言相对于C/C++而言消除了程序员回收无用内存空间的责任:提供了一种系统

杂谈——Android从启动到程序运行发生的事情

转载请注明出处 博客地址:http://blog.csdn.net/JonsTank2013/article/details/51118563 作者:李中权 前言 好久没有写博客了,瞬间感觉好多学了的东西不进行一个自我的总结与消化总归变不成自己的.通过博客可能还可以找到一些当初在学习的时候没有想到的问题.想了半天,从大二上学期自学Android以来还没有对Android从启动到程序运行期间进行一个完整的归纳,刚好最近又学到了一些新东西,那就以这篇博客为媒介,总结一下从Android启动到程序运行

Android从启动到程序运行整个过程的整理

1Android是基于Linux的一个操作系统,它可以分为五层,下面是它的层次架构图,可以记一下,因为后面应该会总结到SystemServer这些Application Framework层的东西 Android的五层架构从上到下依次是:应用层,应用框架层,库层,运行时层,Linux内核层. 而在Linux中,它的启动可以归为一下几个流程: Boot Loader——>初始化内核——>...... 当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都