MPC8245性能监控器:硬件计数器原理与嵌入式系统性能分析实战

发布时间:2026/6/14 18:36:06

MPC8245性能监控器:硬件计数器原理与嵌入式系统性能分析实战 1. MPC8245性能监控器从硬件计数器到系统洞察在嵌入式系统开发尤其是涉及实时性要求或性能敏感的应用场景时我们常常需要回答一些“硬核”问题我的中断服务程序到底花了多少时钟周期PCI总线的平均访问延迟是多少DMA传输期间处理器因为等待总线空闲而“发呆”了多久这些问题如果仅靠软件打点或逻辑分析仪要么侵入性太强影响真实性能要么成本高昂且设置复杂。MPC8245处理器内部集成的性能监控器Performance Monitor就是为解决这类问题而生的硬件利器。它不是软件模拟的计数器而是一组实实在在的硬件计数器能够以近乎零开销的方式精准捕捉处理器内部各种总线、接口和核心单元的活动事件。对于从事网络设备、工业控制或通信设备开发的工程师来说掌握这个工具就如同给系统装上了X光机能从微观时钟周期层面透视软件行为对硬件资源的消耗。简单来说性能监控器的核心工作流程就是“选择-计数-分析”。你通过配置寄存器告诉它“帮我数一数从DMA请求发出到总线授权之间超过5个时钟周期的次数”或者“统计一下所有命中L1缓存的PCI读操作”。它就会在后台默默计数等你需要时读取结果。这比在代码里插一堆get_cycle_count()然后做减法要优雅和准确得多。接下来我们就深入这个硬件的“仪表盘”看看它的每一个旋钮和表盘该如何使用。2. 性能监控器的核心架构与寄存器详解MPC8245的性能监控器并非一个简单的计数器而是一个由多个寄存器精密控制的小型协处理单元。理解它的架构是有效利用它的前提。整个模块的核心是四个32位的性能监控计数器PMC0-PMC3和与之配套的一组配置寄存器。2.1 监控模式控制寄存器MMCR全局指挥官MMCR是整个性能监控器的大脑它不直接参与计数但控制着所有计数器的“行为模式”。其每一位都至关重要配置错误可能导致计数器不工作或计数逻辑混乱。MMCR关键位域解析ENABLE (位7)总开关。这是最基础的位必须置1四个PMC计数器才会开始累加。很多初学者调试时忘了打开这个开关对着始终为0的计数器值百思不得其解。DISCOUNT (位6) 与 PMCTRIG (位0)这是一对互相关联、功能强大的控制位用于实现基于事件的触发与停止机制。DISCOUNT模式当此位置1且PMCTRIG0时任何一个PMC计数器的值变成负数即最高位MSB为1时所有计数器都会立即停止计数。这就像一个全局紧急停止按钮常用于设置一个“总时间”或“总事件数”上限。例如用PMC2倒计数一个测试时长如0x80000000 - 所需周期数当它溢出变负时所有计数器停止你就获得了一段固定时长内的所有事件统计。PMCTRIG模式当此位置1时PMC0的角色从一个普通计数器转变为“触发器”。当PMC0的值变为负数MSB1时它会触发PMC1、PMC2、PMC3开始计数。只有当所有被触发的计数器都再次变为正值MSB0时它们才会停止。这个模式非常适合分析“在某个特定事件发生之后”的系统行为。比如用PMC0监控“缓存失效”事件当失效次数达到阈值PMC0变负后触发其他计数器开始统计之后一段时间内的总线冲突或内存访问延迟。OVERFLOW_01 与 OVERFLOW_23 (位15, 14)扩展计数范围的利器。当OVERFLOW_01置1时PMC0和PMC1将级联成一个64位计数器PMC0作为低32位PMC1作为高32位。此时PMC0的溢出进位Carry-Out会进入PMC1而不是简单地翻转。OVERFLOW_23同理。重要限制启用级联功能时必须确保DISCOUNT0且PMCTRIG0。级联后你只能通过CMDR0对于PMC0/1或CMDR2对于PMC2/3来配置级联计数器对所要监控的事件。注意DISCOUNT和PMCTRIG模式不能与计数器级联OVERFLOW功能同时使用。在设计监控方案时你需要先想清楚是需要超长的计数范围64位还是需要复杂的事件触发逻辑DISCOUNT/TRIG鱼与熊掌不可兼得。2.2 命令寄存器CMDR0-CMDR3事件定义器每个PMC计数器都对应一个CMDR。CMDR决定了对应的PMC“数什么”。它是一个多功能复合寄存器主要包含以下信息命令类型CMD_TYPE选择两大类事件。类型0专用于处理器核心发起的事务读/写并且只能由PMC0和PMC1计数。这类事件的特点是支持阈值过滤。类型1涵盖范围极广包括处理器流水线行为、PCI总线事务、本地内存访问、DMA、I2C、中断控制器PIC活动等。大部分事件四个PMC都可以计数但部分特定事件如后文将讲的突发性分析有指定计数器。事件编码EVENT一个8位的字段在确定了命令类型后用于从该类型的事件列表中选择一个具体的事件。例如类型1事件中0x01代表“内部外设逻辑总线周期数”0x2F代表“命中处理器L1缓存中已修改行的PCI读操作次数”。阈值THRESHOLD一个16位的值这是PMC0和PMC1的专属功能。对于支持阈值的事件所有类型0事件和部分类型1事件只有当事件的度量值如延迟周期数大于设定的阈值时计数器才会加1。否则该次事件被忽略。这让你可以只关注“异常”或“超限”的情况比如只统计延迟超过10个时钟周期的内存访问过滤掉大量正常的快速访问让数据更有针对性。2.3 性能监控计数器PMC0-PMC3数据记录员这就是最终存放计数值的32位寄存器。你可以读写它们在开始监控前将其初始化为特定的起始值例如0或一个倒计数值在监控结束后读取它们以获得最终计数。计数器溢出行为PMC是32位有符号计数器。当从0x7FFFFFFF加1到0x80000000时最高位符号位变为1计数器值变为负数。在DISCOUNT模式下这会触发全局停止。在常规计数中你可以通过读取两个时间点的值并做差来获得期间的事件数即使发生溢出只要差值计算正确考虑到有符号数的环绕结果也是准确的。当然对于预期会发生的巨大计数直接使用64位级联模式是更稳妥的选择。3. 事件类型深度解析与应用场景MPC8245性能监控器的事件库非常丰富理解这些事件的含义是将其应用于实际调试的关键。我们可以将其分为几个功能域。3.1 命令类型0事件处理器事务的显微镜类型0事件专注于处理器核心发起的总线事务。通过CMDR[EVENT]的位组合你可以精确定义要监控的事务类型就像一个高度可配置的过滤器。事件过滤矩阵CMDR[EVENT]的每一位都是一个过滤开关CMDR位名称描述7READ1统计读事务0忽略读事务6WRITE1统计写事务0忽略写事务4MEMORY1统计目标为系统内存的事务3PCI1统计目标为PCI空间包括配置寄存器的事务2ROM1统计目标为本地ROM的事务1BURST1统计突发传输事务0SINGLE_BEAT1统计单拍传输事务组合使用示例如果你想统计所有处理器对系统内存的写操作无论是单拍还是突发可以将EVENT设置为0b0111_0000READ0, WRITE1, MEMORY1, BURST1, SINGLE_BEAT1。这里PCI和ROM位为0表示不关心。如果你只关心处理器通过突发传输方式对PCI设备的读操作可以将EVENT设置为0b1000_1010READ1, WRITE0, PCI1, BURST1, SINGLE_BEAT0。重要限制与提示类型0事件只能由PMC0和PMC1计数。所有类型0事件都支持阈值THRESHOLD。这意味着你可以设置只统计那些延迟从TS断言到第一个TA超过N个周期的事务这对于发现慢速访问非常有用。处理器发起的**窥探回写Snoop Copy Back和被重试Retried**的事务不会被统计。这一点在分析缓存一致性开销时需要注意。3.2 命令类型1事件系统总览仪表盘类型1事件提供了对系统各个子模块的监控能力。参考手册中的Table 16-6是一个宝库我们将其按功能域归纳并解释其典型应用。3.2.1 处理器与核心总线行为事件2 (0x02) - TA重叠周期统计在流水线化事务中从本次事务的TS发出到前一次事务的最后一个TA之间的周期数。这是一个阈值事件。这个值过大说明总线仲裁或目标设备响应慢导致后续事务被阻塞。事件11/12 (0x0B/0x0C) - 核心地址/数据总线忙周期直接反映处理器核心对外部总线资源的占用率。高占用率可能意味着内存带宽成为瓶颈。事件21 (0x15) - 处理器事务突发性分析这是一个高级功能需要PMC0和PMC1配合使用下文会单独详述。3.2.2 PCI总线性能这是分析系统I/O性能的重点。事件33 (0x21) - PCI内存读命令延迟阈值事件。统计从FRAME断言到第一个数据有效之间的PCI时钟周期数大于阈值的次数。这是衡量PCI设备响应速度的关键指标。事件44-48 (0x2C-0x30)一系列与PCI读缓冲PCMRB和缓存命中相关的事件。例如事件44统计“PCI读命中PCMRB但核心逻辑仍在填充该行”的次数这有助于评估预取策略的有效性和PCI主设备重试行为。事件50/51 (0x32/0x33) - PCI空闲/等待周期统计PCI总线上没有有效传输空闲或传输被等待状态插入等待的周期数。两者的比值可以反映总线效率。事件59 (0x3B) - PCI事务突发性分析与事件21类似用于分析PCI总线的突发行为。3.2.3 本地内存SDRAM访问模式事件80-118 (0x50-0x76)这些事件详细区分了针对不同内存页Page 0-3的流水线化/非流水线化访问以及是命中Hit还是缺失Miss。这对于优化内存控制器设置、调整页管理策略、评估缓存效率至关重要。例如如果某个页的非流水线化读缺失事件82, 86等特别多可能需要检查该页对应数据的局部性或者考虑调整内存的访问策略。3.2.4 外设与中断延迟DMA事件140-149 (0x8C-0x95)可以统计DMA通道忙周期、链式模式下特定段的执行时间、以及DMA中断延迟。这对于评估DMA传输效率和实时性至关重要。中断延迟事件 (如0x94, 0x95, 0xD0-0xD8等)可以精确测量从中断源发出请求到CPU中断引脚(INT)有效再到CPU读取中断向量、乃至中断服务程序ISR开始服务并清除中断标志的整个链条中各个环节的延迟。这是硬实时系统调试的“杀手锏”。UART波特率测量事件234/235 (0xEA/0xEB)一个非常巧妙的应用。通过统计固定时间如1秒内UART波特率发生器产生的时钟数可以反推实际波特率并与理论值对比计算误差从而校准分频器。后文有具体示例。3.3 阈值事件过滤噪音聚焦异常阈值功能是性能监控器从“统计”走向“诊断”的关键。它的逻辑很简单对于支持阈值的事件只有当该事件的度量值通常是时间延迟超过你在CMDR[THRESHOLD]中设定的值时对应的PMC计数器才会增加。工作原理图解假设我们监控“处理器到内存的读事务延迟”一个类型0事件阈值设置为2。事务A延迟为1个周期1 2不计数。事务B延迟为3个周期3 2计数1。事务C延迟为2个周期2 2不计数注意是“大于”不是“大于等于”。这样PMC中最终的值就不是总的事务数而是“慢事务”的数量。结合总事务数可以用另一个计数器不加阈值地统计你就能计算出“延迟超过2个周期的慢事务比例”这对于定位性能瓶颈的严重程度非常直观。支持阈值的事件所有命令类型0事件以及命令类型1中的特定事件2TA重叠、9BR到BG延迟、20处理器等待PCI周期、21处理器突发性、33PCI读延迟、59PCI突发性、144/145DMA段耗时。实操心得在初次分析一个未知系统时我通常会分两步走。第一步先不用阈值广泛地统计各类事件的总数了解系统的大致行为轮廓和压力点。第二步针对怀疑有问题的模块如PCI访问启用阈值功能从一个较大的阈值开始比如PCI读延迟阈值设为32逐步缩小阈值观察计数器的变化从而定位延迟的“分布区间”找到是偶尔的极端延迟还是普遍的高延迟。3.4 突发性分析洞察事务流模式突发性分析Burstiness是性能监控器提供的一个高级且强大的功能用于分析事务发生的“密集程度”或“连续性”。它回答的问题是“系统在多大程度上能够以高带宽、低延迟的方式连续处理事务”它的目标是统计“连续发生的、且每两个事务之间间隔延迟不超过Y个周期的事务序列”出现的次数其中这个序列的长度至少为X。配置方法以处理器事务为例事件21PMC0配置为一个命令类型0事件用于定义你感兴趣的事务类型例如所有对PCI的写操作。将其阈值THRESHOLD设置为X即你要求的最小连续事务数量。PMC1配置为命令类型1事件编码为0x15处理器突发性分析。将其阈值THRESHOLD设置为Y即你定义的“可接受延迟”上限。MMCR根据是否需要64位计数决定是否设置OVERFLOW_01。工作流程PMC0像一个“序列长度校验器”。它从0开始每发生一次符合条件的事务就加1。只有当其计数值达到或超过阈值X时它才认为一个“候选序列”开始了。此时PMC0的MSB可能被置位取决于初始值但这在突发性分析中不是停止条件。PMC1像一个“间隔时间监视器”。它监控序列中相邻两个事务之间的延迟。只要连续事务之间的延迟都小于等于Y序列就继续。一旦两个事务之间的延迟超过了Y当前序列就被认为“不合格”PMC0和PMC1的计数逻辑会复位准备检测下一个序列。如果一个序列的长度达到了X并且所有间隔都满足要求那么当序列结束时可能是被一个长延迟打断或者监控周期结束PMC0的计数值会增加1。注意无论这个合格的序列多长100个还是1000个事务PMC0都只增加1。它统计的是“合格序列”的个数而不是事务总数。应用场景评估DMA效率设置X100Y5监控DMA对内存的写事务。如果PMC0最终值很高说明DMA能够长时间保持高效突发传输。如果值很低则说明DMA传输经常被中断或延迟需要检查总线仲裁或目标内存的响应速度。分析缓存效果监控处理器对某块内存区域的读事务。如果开启缓存时合格序列数远高于关闭缓存时则直观证明了缓存对提升访问连续性的贡献。4. 实战案例从寄存器配置到性能洞察理论说得再多不如动手实践。下面我们通过几个具体的、有代表性的例子来看看如何配置这些寄存器以及如何解读得到的数据。4.1 案例一精确测量UART实际波特率与误差在嵌入式系统中UART的波特率通常由系统主频分频得到。如果系统时钟频率因晶振误差或PLL配置问题存在偏差会导致通信波特率不准确。性能监控器可以非常精确地测量这个误差。目标测量UART1和UART2在配置为9600和57300波特率时的实际误差。原理利用一个已知频率的低速参考时钟例如32.768kHz的RTC时钟来产生一个精确的时间窗口比如1秒。在这个时间窗口内用PMC去统计UART波特率发生器产生的时钟个数。理论波特率时钟数 波特率 * 时间窗口。对比理论值和实测值即可算出误差。配置步骤建立时间基准我们利用PMC2的DISCOUNT模式来创建1秒的时间窗口。假设参考时钟为32.768 kHz1秒对应的周期数约为32768 (0x8000)。将PMC2初始化为0x80000000 - 32768 0x7FFF805A32位有符号负数表示。当PMC2从该值向上计数到0x80000000MSB置1时会触发DISCOUNT使所有计数器停止。设置CMDR2让它计数一个在1秒内持续发生的事件例如“内部外设逻辑总线周期”事件10x01。实际上只要PMC2在递增即可。设置MMCRENABLE1,DISCOUNT1,PMCTRIG0。配置被测计数器PMC0CMDR0配置为命令类型1事件234 (0xEA) “UART1波特率时钟数”。关键需要同时设置UART的UAFR1寄存器的bit 1以启用该计数功能。PMC1CMDR1配置为命令类型1事件235 (0xEB) “UART2波特率时钟数”。同样需设置UAFR2的bit 1。PMC0和PMC1初始值设为0。执行与计算启动性能监控器设置MMCR。等待1秒PMC2溢出所有计数器停止。读取PMC0和PMC1的值分别为Count_UART1和Count_UART2。理论计算假设系统时钟设计为100MHzUART分频器除数Divisor根据公式Divisor SysClk / (16 * BaudRate)计算。UART1 (9600): Divisor 100e6 / (16 * 9600) ≈ 651 (0x028B)UART2 (57300): Divisor 100e6 / (16 * 57300) ≈ 109 (0x006D)实测与误差分析假设1秒后Count_UART1 9429,Count_UART2 56315。实测UART1波特率 9429 * 16 150864 Hz。误差 (150864 - 153600) / 153600 ≈ -1.78%。实测UART2波特率 56315 * 16 901040 Hz。误差 (901040 - 916800) / 916800 ≈ -1.72%。误差修正误差主要来源于系统实际时钟并非100MHz。我们可以根据误差反推实际系统时钟或直接调整分频器除数新除数 原除数 * (1 误差)。例如UART1新除数 ≈ 651 * (1 - 0.0178) ≈ 639取整后写入寄存器重新测试。这个案例展示了性能监控器如何将时间测量转化为精确的数字进而用于校准系统。4.2 案例二剖析DMA中断响应全链路延迟在实时系统中中断延迟是核心指标。我们想精确知道从DMA传输完成发出中断请求到CPU开始执行中断服务程序ISR再到ISR清除中断源这整个链条到底花了多少时间目标分解并测量DMA0中断的完整处理延迟。策略使用三个PMC计数器分别监控中断链路的不同阶段。PMC0事件148 (0x94) - “DMA0中断延迟周期数”。这个计数器在DMA控制器内部中断信号有效时开始计数在CPU读取DMA状态寄存器并清除中断标志时停止。它度量的是从硬件中断产生到被软件响应的总时间。PMC1事件208 (0xD0) - “DMA0活动位置位周期数”。这个计数器在PIC中断控制器将DMA0对应的活动位Activity Bit置1时开始计数在PIC收到EOI中断结束命令并清除该活动位时停止。它度量的是中断在PIC中处于“活跃服务”状态的时间。PMC2事件216 (0xD8) - “INT信号有效周期数”。这个计数器在PIC向CPU核心的INT引脚发出中断请求时开始计数在CPU响应中断并执行读PIC的应答操作时停止。它度量的是CPU核心从收到中断请求到开始保存上下文、准备跳转的时间。配置与执行将三个CMDR分别配置为上述事件。所有PMC初始值设为0。设置MMCRENABLE1根据是否需要同时启动或使用触发模式来配置DISCOUNT和PMCTRIG。本例中我们希望三个计数器同时独立运行所以通常将DISCOUNT和PMCTRIG设为0。触发一次DMA0传输完成中断。中断处理结束后读取三个PMC的值。数据分析PMC2的值反映了CPU的中断响应开销。这个时间主要包括完成当前指令、检测INT信号、开始异常处理流程的硬件时间。如果这个值异常大可能需要检查是否在中断发生时CPU正处于关中断状态或者有更高优先级的中断/异常在处理。PMC0与PMC1的差值(PMC0 - PMC1)大致反映了ISR执行时间中从开始到清除DMA中断标志的那部分。因为PMC0在清除标志时停止而PMC1在发送EOI时停止中间可能包含一些ISR收尾工作。PMC1的值反映了中断在PIC中的总停留时间这包括了CPU响应时间PMC2和大部分ISR执行时间。通过这种分解你可以清晰地看到时间消耗在哪个环节。例如如果PMC2很大说明CPU响应慢如果PMC0很大但PMC1与之接近说明大部分时间花在了ISR执行上可能需要优化ISR代码或检查是否有其他中断被屏蔽。4.3 案例三使用突发性分析评估PCI总线吞吐量假设我们设计了一个高速数据采集卡通过PCI总线将数据持续写入MPC8245的系统内存。我们想知道在实际工作负载下PCI写传输是否能保持高效的突发模式。目标统计在1秒内出现“连续至少50次PCI内存写操作且每次写操作之间的空闲间隔不超过8个PCI时钟周期”的序列次数。配置定义事务和序列长度PMC0CMDR0: 命令类型0。EVENT: 设置为0b0100_1011(WRITE1, PCI1, BURST1, SINGLE_BEAT1)。即统计所有对PCI的写事务。THRESHOLD: 设置为49因为我们要统计连续至少50次计数器从0开始达到50时MSB未置1但符合“达到或超过阈值”的逻辑具体实现需参考芯片行为通常设置为X-1。定义可接受延迟PMC1CMDR1: 命令类型1。EVENT: 设置为0x3B (PCI事务突发性分析)。THRESHOLD: 设置为8可接受的空闲周期上限。设置时间窗口PMC2使用DISCOUNT模式将PMC2初始化为1秒对应的负数值例如PCI时钟为33MHz则1秒对应33e6周期初始值0x80000000 - 33e6。CMDR2配置为计数一个持续发生的事件如“PCI周期数”事件320x20。MMCRENABLE1,DISCOUNT1,PMCTRIG0,OVERFLOW_010本例不需要64位计数。执行与解读启动测试运行数据采集任务1秒钟。结束后读取PMC0。如果PMC0 5意味着在这1秒内出现了5段满足条件的“高效突发传输序列”每段都至少包含50次紧密相连的写操作。同时你可以从PMC2的初始值和停止条件推算出实际的测试时长结合PMC0的值可以计算出“高效突发序列”的发生频率。如果PMC0为0或很小说明PCI写操作经常被长延迟打断可能的原因有PCI总线仲裁不公平、目标内存SDRAM页关闭频繁导致激活延迟、或者系统中有其他高优先级PCI主设备在争抢总线。这就需要结合其他事件如PCI空闲周期、等待周期、内存页命中/缺失事件做进一步分析。5. 常见问题、调试技巧与避坑指南在实际使用MPC8245性能监控器的过程中我踩过不少坑也总结出一些让调试更顺畅的技巧。5.1 配置与初始化陷阱计数器不计数首要检查MMCR[ENABLE]位是否置1这是最容易被忽略的一步。事件选择错误确认CMDR中的CMD_TYPE和EVENT编码是否匹配你想要监控的硬件模块。例如想监控PCI事件却错选了类型0。计数器限制确认你选择的事件是否被你使用的PMC支持。例如类型0事件和阈值事件只能用PMC0或PMC1。阈值设置过高对于阈值事件如果阈值设得太大可能永远没有事件能超过它导致计数器始终为0。开始时可以先将阈值设为0确保基础计数功能正常再逐步调整。级联OVERFLOW模式失效确保在启用OVERFLOW_01或OVERFLOW_23时同时将MMCR[DISCOUNT]和MMCR[PMCTRIG]清零。这是手册明确强调的互斥条件。级联后你只需要配置CMDR0对于PMC0/1或CMDR2对于PMC2/3。对CMDR1或CMDR3的配置在级联模式下无效。DISCOUNT/PMCTRIG模式行为异常DISCOUNT模式是“任何计数器变负就停止所有”。如果你用PMC2做定时但PMC0/1也在计数务必注意不要让PMC0/1先溢出变负否则会提前终止整个监控。通常用最高的PMC3做定时更安全。PMCTRIG模式中PMC0作为触发器其“变负”是触发条件。你需要精心设置PMC0的初始值和所监控的事件频率以确保它在合适的时间点触发。5.2 数据解读与优化建议理解“周期”的时钟域大部分处理器和内存事件计数的是**核心总线时钟Core Bus Clock**周期。PCI相关事件计数的是**PCI时钟PCI Clock**周期。在计算延迟时间时务必使用正确的时钟频率进行换算。混淆时钟域是得出错误结论的常见原因。区分“事件次数”与“忙周期数”有些事件统计的是发生次数如“PCI读命令数”。有些事件统计的是持续的总周期数如“核心数据总线忙周期数”。后者除以总运行时间可以得到占用率这是一个非常重要的性能指标。例如内存接口忙周期率超过80%可能就是一个明显的瓶颈信号。结合多个计数器进行关联分析性能监控的强大之处在于关联分析。不要孤立地看一个计数器。示例如果“PCI读延迟超限事件33”计数很高同时“PCI等待周期事件51”也很高那么问题很可能出在PCI总线上从设备响应慢。如果事件33高但事件51不高而“内存页关闭次数事件96/97等”很高那么问题可能出在内存控制器策略上频繁的页开关导致了延迟。使用“基线测量”法在优化前后在完全相同的负载和配置下进行性能监控测量并记录结果。只有对比数据才能量化优化的效果。建立一个“健康系统”的性能指标基线。当系统出现性能下降时通过对比当前数据与基线数据可以快速定位是哪个模块的行为发生了异常变化。5.3 高级技巧性能监控的脚本化与自动化对于复杂的性能分析手动配置和读取寄存器效率太低。我通常会编写一个小的驱动模块或脚本来实现以下功能配置模板化将常用的监控场景如“测量中断延迟”、“分析PCI带宽”、“检查缓存命中率”封装成预设的配置数组方便调用。自动读数与计算在监控周期结束后自动读取所有PMC和CMDR寄存器并根据事件类型自动将计数值转换为有意义的性能指标如平均延迟、占用率、每秒事务数等。定时采样结合定时器中断实现周期性的性能数据采集从而绘制出性能指标随时间变化的曲线这对于发现间歇性性能抖动非常有用。最后记住性能监控器是硬件资源使用它本身会带来极小的开销但在绝大多数情况下可以忽略不计。它的价值在于提供了一种不可替代的、细粒度的系统观察能力。当你对代码的优化陷入瓶颈当你的系统出现无法解释的延迟不妨打开性能监控器让数据告诉你真相。从这些冰冷的数字中你往往能发现最热乎的性能瓶颈所在。

相关新闻