1 测量耗时指标体系:核心指标定义、数据口径、采集粒度

测量阶段耗时分析的第一步,是建立统一的指标体系。本章聚焦三个基础层次:核心指标定义澄清每个指标的业务含义;数据口径规定如何采集原始数据;采集粒度决定数据的最小时间片段。三者共同构成可量化、可对比的耗时分析基础。

1.1 核心指标定义

所有耗时指标均从原始时钟记录中推导。下表列出本期课程使用的五个核心指标及其业务解释:

指标名称 定义 业务含义
总耗时 从测量启动到测量结束的完整时钟时间 反映整体测量效率,包含所有等待与有效操作
阶段耗时 单一子阶段(如“探头定位”“数据采集”)的持续时钟时间 用于识别瓶颈阶段,判断耗时是否集中在特定步骤
有效耗时 阶段内真正执行数据采集、转换或计算占用的 CPU 时间 剔除 I/O 等待、调度延迟后的纯处理时间
等待耗时 阶段内 CPU 空闲或阻塞(等待资源、锁、I/O 完成)的时间 用于评估系统资源争抢、外部依赖延迟问题
耗时占比 阶段耗时 ÷ 总耗时 × 100% 快速识别耗时集中区域,指导优化优先级
关键认知:“耗时”指标若不加说明,默认指时钟时间(wall‑clock time)。在需要区分 CPU 时间时,必须显式使用“有效耗时”或“等待耗时”名称,避免数据误解。

1.2 数据口径

数据口径决定了原始数据的来源与统计方式。本课程统一使用以下三种口径:

  • 时钟时间口径(wall‑clock):取操作系统 clock_gettime(CLOCK_MONOTONIC) 或 std::chrono::steady_clock 记录。适用于总耗时、阶段耗时。
  • CPU 时间口径(per‑process):通过 getrusage() 或 sysconf(_SC_CLK_TCK) 获取用户态+内核态 CPU 周期。适用于有效耗时。
  • 事件采样口径(event‑sample):基于硬件 PMU 计数或 perf 事件的周期采样,用于等待耗时和微架构分析。

口径不一致是耗时分析中最常见的错误源。例如,将时钟时间直接当作有效耗时分析,会人为放大“等待”的假象。

1.3 采集粒度

采集粒度决定最小时间分辨率与数据量。根据分析目的不同,选择以下粒度之一:

  1. 阶段级(phase‑level):每个测量子阶段记录一次起止时刻,粒度通常为毫秒~秒。适合宏观效率评估。
  2. 任务级(task‑level):每个独立测量任务(如一次探针触发、一次数据写入)记录耗时,粒度微秒级。适合瓶颈定位与优化验证。
  3. 连续流级(stream‑level):以固定时间窗口(如 100 ms)持续记录瞬时耗时,生成时间序列。适合周期性波动、瞬时卡顿分析。

粒度选择需平衡数据量与细节。课程后续章节将演示如何根据目标动态切换粒度。

1.4 指标、口径与粒度的关系

下图直观展示了三者如何共同构成完整的时间量测框架:

测量耗时指标体系关系图 测量阶段耗时分析 核心指标定义 数据口径 采集粒度 总耗时 · 阶段耗时 有效耗时 · 等待耗时 耗时占比 时钟时间(wall‑clock) CPU 时间(per‑process) 事件采样(perf/PMU) 阶段级(毫秒~秒) 任务级(微秒级) 连续流级(固定窗口) 说明 指标定义决定“测什么”,数据口径决定“怎么采”,采集粒度决定“多细”。 三者缺一不可,任何一环不清都会导致分析结论偏差。

1.5 实际测量配置示例

在一个典型的测量系统中,采集参数通过 JSON 配置文件指定。以下片段展示了如何同时定义口径与粒度:

{
  "measurement": {
    "phase": "data_capture",
    "time_source": "CLOCK_MONOTONIC",
    "granularity": "task",
    "cpu_time": true,
    "output": "timeseries"
  }
}

该配置指定:时钟时间源为单调时钟,粒度精确到任务级,同时记录 CPU 时间,输出为时间序列(连续流级)。

常见陷阱:采集粒度设定为“任务级”但未开启 cpu_time,则只能得到时钟时间,无法区分有效与等待耗时。务必在配置中同时声明所需口径。

1.6 本章小结清单

  • 掌握 5 个核心指标:总耗时、阶段耗时、有效耗时、等待耗时、耗时占比。
  • 区分三种数据口径:时钟时间、CPU 时间、事件采样。
  • 理解三种采集粒度:阶段级、任务级、连续流级。
  • 记住指标、口径、粒度三者必须配合定义,缺一不可。
  • 实际配置中通过 JSON/YAML 显式声明 time_source、granularity 和 cpu_time 字段。