18、深入理解计算机系统笔记:测量程序执行时间

简介: 1、人不能够觉察短于大约100ms的时间段。 2、计算机有一个外部计时器,它周期性地向处理器发送中断信号。这些中断信号之间的时间被称为间隔时间(interval time)。 3、从一个进程切换到另一个进程需要几千个时钟周期来保存当前当前进程的状态。

1、人不能够觉察短于大约100ms的时间段。

2、计算机有一个外部计时器,它周期性地向处理器发送中断信号。这些中断信号之间的时间被称为间隔时间(interval time)。

3、从一个进程切换到另一个进程需要几千个时钟周期来保存当前当前进程的状态。典型的计时器间隔范围是110ms

4、通过间隔计数(interval counting)来测量时间

OS也用计时器(timer)来记录每个进程使用的累计时间,这种信息提供的是对程序执行时间不那么精确的测量值。这种方法只对长持续时间(到少1s)的测量有用。

OS维护着每个进程使用的用户时间量和系统时间量的计数值。

通过如下两种方法读进程的计数器

1shell的命令前加time

    结果前两个值为命令进程执行的用户和系统时间,第三个值为执行经过的总时间。

2)调用函数times来读进程的计时器。

示例代码

#include <sys/times.h>
struct tms {
clock t tms utime; /* user time */
clock t tms stime; /* system time */
clock t tms cutime; /* user time of reaped children */
clock t tms cstime; /* system time of reaped children */
}

clock t times(struct tms *buf);
Returns: number of clock ticks elapsed since system started

#include <time.h>
clock t clock(void);
Returns: total time used by process

这些时间测量值是以时钟滴答(clock tick)为单位来表示的。定义的常数CLK_TCK指明每秒的时钟滴答数。The fields indicating child times give the

accumulated times used by children that have terminated and have been reaped.(意为每个子域给出了我们可能需求的一个子时间项,这些子时间项是由已经终止,且被回收的子进程所累积)

因此,times不能用来监视任何正在进行的子进程所使用的时间。作为返回值,返回的是从系统启动开始已经经过的时钟滴答总数。

3ANSI C定义了一个clock函数来测量当前进程使用的总时间。要将clock函数报告的时间变成秒数,要除以定义常数CLOCKS_PER_SEC,这个常数不一定与CLK_TCK相同。

5、通过周期计数器来测量时间

CPU上有一个特殊的计时器,每个时钟周期加1

本书9.3.1节讲述了通过汇编代码来获取这个周期计数器的值的过程。可以得到在微观尺度上很好的测量值。

同时讲述了k次最优测量方法。

6、通过gettimeofday函数的测量

gettimeofday函数查询系统时钟(system clock)以确定当前的日期和时间。

示例代码

#include "time.h"
struct timeval {
long tv sec; /* Seconds */
long tv usec; /* Microseconds */
}
int gettimeofday(struct timeval *tv, NULL);
Returns: 0 for success, -1 for failure

linux中,第二个参数设置成NULL,因为它指向一个未被实现的执行时区校正的特性。

示例代码

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/* $begin tod */
#include <sys/time.h>
#include <unistd.h>

static struct timeval tstart;

/* Record current time */
void start_timer()
{
    gettimeofday(&tstart, NULL);
}

/* Get number of seconds since last call to start_timer */
double get_timer()
{
    struct timeval tfinish;
    long sec, usec;

    gettimeofday(&tfinish, NULL);
    sec = tfinish.tv_sec - tstart.tv_sec;
    usec = tfinish.tv_usec - tstart.tv_usec;
    return sec + 1e-6*usec;
}
/* $end tod */

实现依赖于gettimeofday是如何实现的,而gettimeofday的实现随系统不同而不同。

7、更多关于测量的方法和技巧,参见9.4,9.5,9.6,9.7

<Computer Systems:A Programmer's Perspective>

目录
相关文章
|
Linux 网络安全
CentOS 7 SSH连接超时自动断开解决方案
CentOS 7 SSH连接超时自动断开解决方案
1328 0
CentOS 7 SSH连接超时自动断开解决方案
|
9月前
|
存储 缓存 负载均衡
一致性哈希:解决分布式难题的神奇密钥
一致哈希是一种特殊的哈希算法,用于分布式系统中实现数据的高效、均衡分布。它通过将节点和数据映射到一个虚拟环上,确保在节点增减时只需重定位少量数据,从而提供良好的负载均衡、高扩展性和容错性。相比传统取模方法,一致性哈希能显著减少数据迁移成本,广泛应用于分布式缓存、存储、数据库及微服务架构中,有效提升系统的稳定性和性能。
563 1
|
11月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
7914 129
|
10月前
|
存储 搜索推荐 定位技术
布谷直播系统源码开发搭建更新计划-山东布谷科技
山东布谷科技不断更新迭代布谷直播app,根据当前市场需求不断研究新功能更新迭代直播软件计划,以保证布谷直播app是当前直播运营市场的第一选择!
|
11月前
|
缓存 负载均衡 API
抖音抖店API请求获取宝贝详情数据、原价、销量、主图等参数可支持高并发调用接入演示
这是一个使用Python编写的示例代码,用于从抖音抖店API获取商品详情,包括原价、销量和主图等信息。示例展示了如何构建请求、处理响应及提取所需数据。针对高并发场景,建议采用缓存、限流、负载均衡、异步处理及代码优化等策略,以提升性能和稳定性。
|
11月前
|
Unix Linux 数据安全/隐私保护
Linux用户与用户组管理(详解)
Linux用户与用户组管理(详解)
168 5
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s 网络插件—Antrea
【K8S系列】深入解析k8s 网络插件—Antrea
928 0
|
NoSQL Redis 数据库
docker-compose 自动管理 数据库
docker-compose 自动管理 数据库
429 3
|
JavaScript 开发者
在Vue中引入Message,弹窗提示错误信息
这篇文章讲述了在Vue CLI项目中如何处理异常,通过引入Message组件实现弹窗提示错误信息,帮助开发者排查和解决webpack等问题。
|
Java Spring
好疑惑!idea启动、spring boot、无法加载或找不到主类
好疑惑!idea启动、spring boot、无法加载或找不到主类
840 0
好疑惑!idea启动、spring boot、无法加载或找不到主类