- 浏览: 622365 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
oldrat:
引用Special cases aren't special ...
武汉大学开源技术俱乐部 技术交流 第1期 -
yzsunlight:
试了试 ,不行
Android Studio SDK Manager无法正常下载如何设置 -
qianjigui:
更全面的文档:http://www.5wpc.info/it/ ...
Ruby正则表达式操作参考 -
qianjigui:
Anddy 写道Anddy 写道tag是自动创建的吗? 能手动 ...
vim的跳转 -
Anddy:
Anddy 写道tag是自动创建的吗? 能手动创建吗? 在sh ...
vim的跳转
理论基础
在进行系统时间获取并用于程序性能分析时,我们需要考虑精确而有效的时间获取方法。
在《深入理解计算机系统》这本书中谈到,目前进行时间测量的系统接口和方法有两种:
通过间隔计数的方法:
OS维护着每个进程使用的用户时间量和系统时间量的计数值,当计时器中断发生时,OS会确定哪个进程是活动的,并且对那个进程的一个计数值增加计时器间隔时间。这时会根据进程的状态,如果是内核态就增加系统时间,否则增加用户时间。
这种计时方式并不管在这个时间段(两个计时器中断之间)内到底用了多少时间,所以不够准确。但是从长时间考虑,这个平均值还是可以接受的。
利用周期计数器的方法:
很多CPU包含了一个运行在时钟周期级的计时器。这个计时器其实是个特殊的寄存器,每个时钟周期会加1。这个工具可以用来测量一个程序执行中两个不同点之间经过的时间。就是基于系统时间点的测量,而在这两点之间的情况并不关心。这样导致了多任务系统上,这种计时器只能用于对比而无法直接表示进程时间消耗。所以其受上下文切换、高速缓存的影响。
通过上面的比较和介绍,我们可以看到,两种方法各有优劣、是从不同的方向来进行时间测量的。
所以,这本书在章节后面给出了一个协议:
如果程序X预期的运行时间很长(运行时间远远大于间隔计数的时间段),可以使用间隔计数的方式。
如果X预期运行时间大概在0.01~1.0s之间,那么在负载很轻的系统上,就需要使用周期计时的方式。在这里强调负载轻,主要原因是害怕上下文切换等因素的影响。
如果X预期运行时间小于0.01s,那么就使用周期计时的方式。这时候,由于时间很短,不用担心负载问题,上下文切换等因素起到的影响就很小了。
下面分析我们通常使用的:
-----------------------------------
clock_gettime:
.save {r4, r7}
stmfd sp!, {r4, r7}
ldr r7, =__NR_clock_gettime
swi #0
ldmfd sp!, {r4, r7}
movs r0, r0
bxpl lr
b __set_syscall_errno
.fnend
-----------------------------------
gettimeofday:
.save {r4, r7}
stmfd sp!, {r4, r7}
ldr r7, =__NR_gettimeofday
swi #0
ldmfd sp!, {r4, r7}
movs r0, r0
bxpl lr
b __set_syscall_errno
.fnend
-----------------------------------
这两个函数都是直接进行了系统调用。
关于时间源这类的时间调用是复杂的,我也没有做这方面工作的经验,不敢乱言。
使用说明请参考: http://www.360doc.com/content/11/0715/09/1317564_133662142.shtml
gettimeofday()提供了微秒级的精确度
1、头文件 <time.h>
2、函数原型
int gettimeofday(struct timeval *tv, struct timezone *tz);
gettimeofday()会把目前的时间由tv所指的结构返回,当地时区的信息则放到tz所指的结构中(可用NULL)。
参数说明:
timeval结构定义为:
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
timezone 结构定义为:
struct timezone
{
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /*日光节约时间的状态*/
};
上述两个结构都定义在/usr/include/sys/time.h。tz_dsttime 所代表的状态如下
DST_NONE /*不使用*/
DST_USA /*美国*/
DST_AUST /*澳洲*/
DST_WET /*西欧*/
DST_MET /*中欧*/
DST_EET /*东欧*/
DST_CAN /*加拿大*/
DST_GB /*大不列颠*/
DST_RUM /*罗马尼亚*/
DST_TUR /*土耳其*/
DST_AUSTALT /*澳洲(1986年以后)*/
返回值: 成功则返回0,失败返回-1,错误代码存于errno。附加说明EFAULT指针tv和tz所指的内存空间超出存取权限。
#include<stdio.h>
#include<time.h>
int main(void)
{
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);
printf(“tv_sec; %d/n”, tv,.tv_sec) ;
printf(“tv_usec; %d/n”,tv.tv_usec);
printf(“tz_minuteswest; %d/n”, tz.tz_minuteswest);
printf(“tz_dsttime, %d/n”,tz.tz_dsttime);
return 0;
}
clock_gettime( ) 提供了纳秒级的精确度
1、头文件 <time.h>
2、编译&链接。在编译链接时需加上 -lrt ;因为在librt中实现了clock_gettime函数
3、函数原型
int clock_gettime(clockid_t clk_id, struct timespect *tp);
参数说明:
clockid_t clk_id 用于指定计时时钟的类型,有以下4种:
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户该成其他,则对应的时间相应改变
CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
struct timespect *tp用来存储当前的时间,其结构如下:
struct timespec
{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
返回值。0成功,-1失败
#include<stdio.h>
#include<time.h>
int main()
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
printf("CLOCK_REALTIME: %d, %d", ts.tv_sec, ts.tv_nsec);
clock_gettime(CLOCK_MONOTONIC, &ts);//打印出来的时间跟 cat /proc/uptime 第一个参数一样
printf("CLOCK_MONOTONIC: %d, %d", ts.tv_sec, ts.tv_nsec);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);
printf("CLOCK_PROCESS_CPUTIME_ID: %d, %d", ts.tv_sec, ts.tv_nsec);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
printf("CLOCK_THREAD_CPUTIME_ID: %d, %d", ts.tv_sec, ts.tv_nsec);
printf("/n%d/n", time(NULL));
return 0;
}
/proc/uptime里面的两个数字分别表示:
the uptime of the system (seconds), and the amount of time spent in idle process (seconds).
把第一个数读出来,那就是从系统启动至今的时间,单位是秒
发表评论
-
Android Studio SDK Manager无法正常下载如何设置
2014-06-02 10:29 5730一方面在/etc/hosts中设置: #Google主页 ... -
Ruby 2.1 GC策略
2014-01-23 11:30 951对象管理主要涉及: Profiling support ... -
Google 持续集成介绍
2014-01-23 11:26 1563见附件PPT. 具体方案 构建描述 依赖分析 ... -
Ubuntu 10.04 企业 Cisco VPN 安装与配置使用
2013-12-31 23:36 789更全的版本见: http://www.5wpc.info/ ... -
函数式编程 读后感
2013-12-30 15:24 1452一篇比较不错的文章: http://coolshel ... -
系统模块集成管理与版本控制学习
2013-12-27 12:01 1337论软件生命周期集成 http://www.infoq.com ... -
Ruby 动态特性鉴赏
2013-12-26 16:47 1335以下代码与代码学习来自<Ruby Best Prac ... -
Android应用插件化与动态部署 学习
2013-12-26 16:45 0通过REST将相关服务有语义的组合起来。 动态部署: ... -
用Markdown做文档的问题
2013-12-23 18:06 863一直有想一种语言能够解决文档编写问题。 一般文档编写 ... -
Android组件、通信与安全机制学习
2013-12-20 12:26 0现有问题: Android的组件间通信有哪些方法?其中的I ... -
Android root 原理学习
2013-12-15 23:51 2329学习资源: http://www.zhihu.com/qu ... -
Android PREBUILT APPS 运行dex preopt
2013-12-09 13:57 0主体思路是模仿package的preopt处理,对buil ... -
Android 设置/system/bin/cmd的权限遇到的问题
2013-11-25 16:17 2064Android开发的过程中,需要添加一些系统服务,而这些服 ... -
模块网络访问分析
2013-12-27 11:29 895上述工作,可以通过: 人工了解 主要是沟通成本太高 ... -
Android系统启动过程整体视图
2013-11-25 11:07 756整体如上图:分为三个系统体系: uboot Li ... -
将设备的部分分区dump出来
2013-11-20 14:25 808基本命名: dd if=/dev/block/mmcblk ... -
Android Build系统bash filename too long问题
2013-11-06 10:45 1481在对Android Build系统进行修改的过程中,可能会在 ... -
VIM diff 模式使用
2013-11-04 11:24 827vimdiff mode: do -- Get chan ... -
Linux工作基本使用
2013-11-04 11:23 998Mount相关 sudo apt-get install ... -
Android 4.2 init: skipping insecure file '/init.rc' 问题
2013-11-01 13:13 3535一个比较完整的分析见:http://blog.csdn.ne ...
相关推荐
《深入理解计算机系统 第3版》是一本由Randal E. Bryant和David R....然而,尽管存在这些技术障碍,本书仍然是深入了解计算机系统工作的宝贵资源,对程序员和计算机科学学生来说,具有非常高的学习价值。
《深入理解计算机系统》(第二版)作为一本经典的计算机教程书籍,旨在为读者提供一个全面而深入的学习平台,帮助他们了解计算机系统的内部工作原理。本书尤其注重将软件与硬件知识紧密结合,不仅讲解了基本概念,还...
《深入理解计算机系统(原书第2版)》是计算机科学领域的经典教材,由Randal E. Bryant和David R. O’Hallaron撰写。本书的编排和内容深入浅出,旨在从程序员的角度来阐述计算机系统的工作原理。该书通过剖析硬件与...
从给定的文件内容来看,标题“深入理解计算机系统(清晰英文版)”指向的是一本广受欢迎的计算机科学教材,即《深入理解计算机系统》(CS:APP),第三版。本书由Randal E. Bryant和David R. O'Hallaron两位教授撰著...
《深入理解计算机系统》(CSAPP)是一本广泛使用的计算机科学教材,它涵盖了计算机系统的基础知识,包括硬件、操作系统、编译器、网络和安全等多个领域。这份实验材料旨在通过实践帮助读者深化对这些概念的理解。 ...
《深入理解计算机系统》是计算机科学领域的一本经典教材,主要涵盖了计算机系统的基础知识和核心概念,对于理解和优化计算机程序的性能至关重要。该书的第二版在第一版的基础上进行了更新和扩展,旨在提供更为全面和...
在MATLAB环境中开发数据转换测量仪器驱动程序是一个高级的工程任务,主要涉及到计算机与硬件设备之间的通信以及数据处理。这个项目的核心是利用IVI-COM(Instrument Virtual Instrumentation Class for ...
【标题】"蓝桥杯 第九届决赛-多功能测量仪表 - 完整版.zip" 提供的是一...学习这个项目不仅可以提高单片机编程能力,还能掌握实际工程中的问题解决技巧,对于想要深入理解和实践单片机应用的人来说,是一份宝贵的资源。
该书通过源代码的形式,将复杂的数学理论转化为可执行的程序,帮助读者深入理解测量平差的方法和技术。这本书的源程序文件与书中的章节紧密关联,为学习者提供了实际操作的机会,使得理论知识能够得到实践验证。 ...
在电子工程领域,单片机是一种集成在单一芯片上的微型计算机,广泛应用于各种控制系统中。在C51单片机编程中,定时器是至关重要的组成部分,它能够执行计数和定时任务,常用于实现脉冲测量、周期检测以及定时触发等...
计算机系统结构是信息技术领域的核心课程,它探讨了计算设备如何设计、构建以及它们如何执行指令集。"量化研究方法"在此领域中意味着使用数学和统计工具来理解和优化系统的性能。这个光盘包含了多个PDF文档,可能...
综上所述,电子科技大学的高级计算机系统结构课程涵盖了丰富的知识点,旨在帮助学生深入理解计算机系统的工作原理和技术发展趋势。通过对这些知识点的学习,学生们不仅能掌握计算机系统的理论基础,还能学会如何应用...
这份2010年湖北的最新自考计算机系统结构PPT,为我们提供了深入理解这一领域的关键知识点。 一、计算机系统概述 1. 计算机系统的组成:包括中央处理器(CPU)、内存、输入/输出设备和外部存储器等部分,它们协同...
这个领域的程序设计通常需要深入理解计算机视觉、数学、几何以及物理学等多方面的知识。"摄影测量程序"的标题暗示了我们正在讨论的是一个用于实现摄影测量算法的软件系统,这样的程序可以帮助用户更好地理解和应用...
1. **C++基础知识**:首先,你需要对C++语言的基本语法、数据类型、控制结构、函数等有深入理解,这是编写任何程序的基础。 2. **面向对象编程**:C++支持面向对象编程,全站仪自动测量程序可能需要定义多个类,如...