你的程序运行使用了多少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();
while( times-- ) ;
end = clock();
duration = (double)(end - start) / CLOCKS_PER_SEC;
printf( "%f 秒\n", duration );
system("pause");
return ;
}
在我笔记本上运行的结果是:

大家也可以在你们的电脑是执行下,看看你们的笔记本是否可以可以甩我一条街!
你的程序运行使用了多少CPU,秒知!的更多相关文章
- 程序运行的cpu时间
time.clock() 测量CPU时间,比较精准,通过比较程序运行前后的CPU时间差,得出程序运行的CPU时间.
- 基础知识《零》---Java程序运行机制及运行过程
Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...
- java入门(1) 程序运行机制及运行过程
首先我们来看一下java程序在底层是怎么工作的: JAVA有两种核心机制: Java虚拟机(Java Virtual Machine): 1.java虚拟机可以理解成一个以字节码为机器指令的CPU. ...
- 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究
原文:查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 -理解性能疑点 1 引言 内容来自http://www.so ...
- Android从启动到程序运行整个过程的整理
1Android是基于Linux的一个操作系统,它可以分为五层,下面是它的层次架构图,可以记一下,因为后面应该会总结到SystemServer这些Application Framework层的东西 A ...
- Spark程序运行常见错误解决方法以及优化
转载自:http://bigdata.51cto.com/art/201704/536499.htm Spark程序运行常见错误解决方法以及优化 task倾斜原因比较多,网络io,cpu,mem都有可 ...
- 单片机内程序运行的时候ram空间是如何分配的?
转自:http://blog.sina.com.cn/s/blog_a575eb9401014tam.html 单片机内程序运行的时候ram空间是如何分配的?我现对一个程序进行减少片内ram的使用的优 ...
- 21ic编辑推荐:从单片机开始的程序运行
一直不清楚单片机中程序的执行过程,就是知道一个程序总是从一个main函数开始执行,然后把程序段存放在ROM里面,动态数据存放在RAM里面,而单片机的RAM资源又是及其的稀少,所以要省着用,但是到底怎么 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
随机推荐
- java 接口默认修饰符
概论: java接口可以是public 的,也可以是friendly的,但一定是abstracted的. java接口里的方法只能是public的.abstract的. java接口里的成员变量只能是 ...
- 的确,Java存在缺陷。但是……
[编者按]本文作者为资深码农 Tim Spann,主要讲述 Java 让人无法抗拒的众多优点以及一些些缺陷.本文系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文. 早在90年代中期,笔者 ...
- selenium模拟鼠标操作
Selenium提供了一个类ActionChains来处理模拟鼠标事件,如单击.双击.拖动等. 基本语法: class ActionChains(object): """ ...
- ubuntu-15.04-desktop-amd64想要安装KDE桌面,结果出现如下问题
The following packages have unmet dependencies: kubuntu-desktop : Depends: ark but it is not going t ...
- VisualSVN Server迁移的方法
VisualSVN Server迁移涉及到两种情况: 第一种情况:VisualSVN Server没有更换电脑或者服务器,只是修改Server name. 第二种情况:当VisualSVN Serve ...
- 教你如何获取ipa包中的开发文件
教你如何获取ipa包中的开发文件 1. 从iTunes获取到ipa包 2. 修改ipa包然后获取里面的开发文件
- 【FLEX教程】#008 开发中的问题笔记(慢更…)
在这里记录一下个人在FLEX开发中遇到的一些问题.方便一些遇到同样问题的朋友们,能够快速的解决这些问题. 这篇笔记我会慢慢的更新,(PS:有遇到问题就往上面更….) 2015年1月4日 12:53:5 ...
- 【Alpha】Daily Scrum Meeting——blog1
团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 忘记拍了,能补上不? 2. 每个人的工作 3. 燃尽图
- .Net WebApi 支持跨域访问使用 Microsoft.AspNet.WebApi.Cors
首先导入Cors库,通过程序包管理控制台导入 Install-Package Microsoft.AspNet.WebApi.Cors 引用库之后,我们需要进行简单的配置. 现在WebApiConfi ...
- 【译文】MySQL InnoDB 使用的锁分析
InnoDB 使用的 锁类型 共享锁和排它锁 意向锁 记录锁 间隙锁 Next-key 锁 插入意向锁 AUTO-INC 锁 共享锁和排他锁 InnoDB实现了俩个标准的行级锁,共享锁和排它锁. 共享 ...