第2章 性能测量
理解应用程序性能的第一步是学会对它进行测量。
与绝大多数功能问题相比,性能问题通常很难跟踪和复现。
任何关注过性能评估的人可能都知道公允地进行性能测量并从中得到准确结论是多么困难。
因为在测量中存在误差,性能分析通常需要统计方法进行处理。
开展公允地性能实验是获得精确及有意义结果的基本步骤。设计性能测试和配置测试环境都是性能评估工作的重要组成部分。
2.1 现代系统中的噪声
动态频率调节是一个硬件特性,但是测量结果差异还有可能来自软件功能。
不幸的是,测量偏差还不只来自环境配置。Unix环境变量的大小(即存储环境变量所需要的字节数)和链接顺序(提供给链接器的目标文件顺序)能够对性能产生不可预知的影响。
在运行时有效且重复地将代码、堆栈和堆对象随机放置,可以消除由内存排布引起的测量偏差。
获得一致的测量结果需要所有基准测试都在同样的条件下进行。
消除系统的不确定性有助于进行定义明确、稳定的性能测试,需要控制基准测试中大部分变量,包括输入、环境配置等。
当估计实际程序的性能优化效果时,不建议去除系统的不确定的行为。工程师应当尝试复制被优化的目标系统的配置,在被测系统中引入人为调整会导致用户在实际使用中的结果不一致。此外,任何性能分析工作-包括采样,都应当在与实际部署最接近的系统下进行。
2.2 生产环境中的性能测量
随着虚拟化和容器等技术的日渐流行,公有云供应商也尝试最大化服务器资源的利用率。但是这种环境为性能测量带来了新的困难,因为与相邻进程共享资源会对性能测量产生不可预知的影响。
大型服务提供商通过部署遥测系统来监控用户设备的性能已经成为一种趋势。
测量开销是生产环境监控的一个重要问题。由于任何监控都会影响正在运行的服务的性能,因此应该使用尽可能轻量的性能剖析方法。
通常可以接受整体不超过1%的性能损失的检测开销,减少监控开销的办法包括限制被监控的机器数量和使用更小的监控时间间隔。
2.3 自动检测性能退化问题
软件供应商提高产品的部署频率逐渐成为一种趋势,但是软件的性能缺陷会以惊人的速度蔓延到生产环境中。
软件性能退化是指软件从一个版本演进到下一个版本时被错误地引入缺陷。解决办法如下:
1. 安排人员看图来比较结果,不过这种办法很快就被抛弃了,因为人很容易因为注意力不集中而错过性能退化缺陷。
2. 设定1个简单的阈值阀门。缺点在于选择合适的阈值门限是非常困难的事情,并且不能保证误报率低。阈值设定过低会导致误报一些由随机噪声引起的而不是代码变化引起的性能退化数据,阈值设定过高会导致过滤不出真正存在的性能退化问题。
无论使用何种算法来检测性能退化问题,典型的CI系统都应当能够自动进行以下动作:
1. 配置待测试系统。
2. 运行程序;
3. 报告运行结果;
4. 判断性能是否发生变化;
5. 将结果可视化。
CI系统应当能够同时支持自动基准测试和手动基准测试,产生可复现的结果,并对发现的性能退化问题生成工单。迅速检测性能退化问题也非常重要。
2.4 手动性能测试
本地性能评估的基本建议:
1. 多次测量基线性能;
2. 多次测量修改后的程序的性能;
3. 对2者进行比较;
使用统计分布图的一个优势是可以发现基准测试中的不良行为。如果数据分布是双峰的,基准测试会表现出两类不同的行为,引起双峰分布的常见原因是代码有快、有慢两条执行路径,例如访存缓存、获取锁等。解决这些问题的方法是隔离不同的功能模块并分别进行基准测试。
性能数据分布的可视化展示可以帮助我们发现某些异常,但我们不应当同它来进行加速比的计算。假设检验非常适合用来确定性能加速(减速)的表现是否具有随机性。
一旦通过假设检验方法确定2组数据存在统计上显著的差异,就可以使用算术平均或几何平均的方法来计算加速比。注意对于小样本采样,均值和几何均值会受到异常值影响。除非数据分布具有小方差,否则不应当只考虑使用均值。
如果测量值的方差与均值大小在同一个数量级,那么均值就不是具有代表性的指标。
为了准确地计算加速比,最重要的工作之一就是收集大量的样本数据。这听上去很容易,但有时并不可行,太多基准测试叠加下来的测试时间太长了。
需要收集多少样本数据才满足统计分布需要呢?这取决于对比测试的精确到要求。分布数据中样本的方差越小,需要的样本数越少。实施自适应策略,收集样本直到标准差达到特定的范围。
另一个需要特别小心的是异常值的存在。对某些类型的基准测试而言,异常值可能是重要的指标。
2.5 软件计时器和硬件计时器
系统级高分辨率计时器:通过统计自某任意时间起开始流逝的滴答数而实现。系统级计时器分辨率是ns级别,并且在所有CPU上都是一致的,它适合用来测量持续时间超过1us的事件。
时间戳计时器TSC:通过硬件寄存器实现的硬件计时器,它适合用来测量持续时间从ns到1 min之间的事件,可以用编译器的内置函数__rdtsc查询。
如果需要测量的时间很短暂,则TSC可以提供更好的准确度。相反,如果需要测量的时间长达数小时,则TSC测量毫无意义。除非真的需要时钟周期的精度,否则大部分情况下选择系统计时器通常就足够了。
2.6 微基准测试
微基准测试程序是在优化某些特定功能时跟踪优化进展的手段。对于C++而言,使用Google benchmark库,C#则是BenchmarkDotNet库,Julia则是BenchmarkTools库,Java则是Java Microbenchmark Harness。
定义一个基准测试优劣的依据是,它能否在真实条件下测试将来要使用的功能的性能。
如果基准测试使用的合成输入与实际使用的输入不同,那么基准测试可能会误导你。所以,在根据单元测试的结果总结结论时要小心。
2.7 本章小结
1. 由于测试的不稳定性,调试性能通常比调试功能更为困难。
2.确定预期目标,需要为如何衡量该目标设定有意义的定义和指标。根据关心的内容,它可能是吞吐量、延迟、每秒操作数(屋顶线模型)等。
3.再生产部署中衡量性能时,为了处理环境噪声的问题,需要使用统计方法分析结果。
4. 越来越多的大型分布式软件供应商选择直接在生产系统上剖析和监控性能,这要求只能使用轻量级的剖析技术。
5. 采用自动化性能跟踪系统有助于防止性能退化问题渗透到生产软件系统中,此类CI系统应能够运行自动化性能测试,可视化结果并标记潜在缺陷,这也是向受众展示性能结果的稳妥办法。
6. 性能数据分布之间的统计关系可以通过假设检验方法来识别和发现。
7. 系统级高分辨率计时器适合测量持续时间超过1us的事件,若需要高精度测量短事件,则可以使用时间戳计时器。
8. 微基准测试适合迅速证明一些事情,但是你应该始终在实际条件下用真实的程序验证你的想法。
相关文章:
第2章 性能测量
理解应用程序性能的第一步是学会对它进行测量。 与绝大多数功能问题相比,性能问题通常很难跟踪和复现。 任何关注过性能评估的人可能都知道公允地进行性能测量并从中得到准确结论是多么困难。 因为在测量中存在误差,性能分析通常需要统计方法进行处理…...
未来,运营的重要性大于产品?
微博上看到某产品大V的一个观点,说在未来,产品运营的重要性会大过产品经理,还挺认同的,谈谈我的想法。 这个观点的核心依据是,目前没有新的产品形态,各种产品解决方案都是标准化的,产品由开疆辟…...
paddle ocr框架识别数字问题和解决方案
识别出的字符串重复 情况1:检测错误,同一个字符串被两次检测到 比如 “12 方案 ” 被识别成:“12” “2方案”,这种可以通过x坐标交叉并且第一个结果最后一个字符与第二个结果第一个字符相同判断 情况2: 识别错误&am…...

构建高性能的MongoDB数据迁移工具:Java的开发实践
随着大数据时代的到来,数据迁移成为许多企业和组织必须面对的挑战之一。作为一种非关系型数据库,MongoDB在应用开发中得到了广泛的应用。为了满足数据迁移的需求,我们需要一个高性能、稳定可靠的MongoDB数据迁移工具。下面将分享使用Java开发…...

2023年国赛数学建模思路 - 案例:最短时间生产计划安排
文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…...

1572. 矩阵对角线元素的和
题目描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例: 解题思路: 同时求对角线和副对角线上元素的和再减去重合的元素 相关代码…...

在vue中使用swiper轮播图(搭配watch和$nextTick())
在组件中使用轮播图展示图片信息: 1.下载swiper,5版本为稳定版本 cnpm install swiper5 2.在组件中引入swiper包和对应样式,若多组件使用swiper,可以把swiper引入到main.js入口文件中: import swiper/css/swiper.css //引入swipe…...
Java书签 #使用MyBatis接入多数据源
楔子:当然,世上有很多优秀的女性,我也会被她们吸引。这对男人来说是理所当然的。但目光被吸引和内心被吸引是截然不同的。- 东野圭吾《黎明之街》 今日书签 在一些应用场景中,可能需要连接多个不同的数据库,例如连接不…...
神经网络基础-神经网络补充概念-23-神经网络的梯度下降法
概念 神经网络的梯度下降法是训练神经网络的核心优化算法之一。它通过调整神经网络的权重和偏差,以最小化损失函数,从而使神经网络能够逐渐逼近目标函数的最优值。 步骤 1损失函数(Loss Function): 首先,…...

鸿蒙3.1 设备管理DeviceManager
介绍 DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。 其组成及依赖如下所示: 总结 设备管理模块其实就是软总线的包皮服务。目前权限都是控制系统uid,但是根据官方介绍,后续可…...

Git 目录详解
一、Git目录详解 在使用Git时,有几个目录和文件在Git项目中扮演着重要的角色,下面详细介绍一下这些目录和文件的作用 1、.git目录 .git目录是Git项目的核心,包含了Git的版本库和元数据等重要信息。在该目录中,有一些重要的子目录和…...

基于springboot+vue的武汉旅游网(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

步入React正殿 - React组件设计模式
目录 扩展学习资料 高阶组件 /src/components/hoc/withTooltip.js /src/components/hoc/itemA.jsx /src/components/hoc/itemB.jsx /src/App.js 函数作为子组件【Render pprops】 函数作为子组件 /src/components/rp/itemC.jsx【父组件】 /src/components/rp/withToo…...

Java 单例模式简单介绍
何为单例模式 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 实现思路 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必…...

根据源码,模拟实现 RabbitMQ - 从需求分析到实现核心类(1)
目录 一、需求分析 1.1、对 Message Queue 的认识 1.2、消息队列核心概念 1.3、Broker Server 内部关键概念 1.4、Broker Server 核心 API (重点实现) 1.5、交换机类型 Direct 直接交换机 Fanout 扇出交换机 Topic 主题交换机 1.6、持久化 1.7…...

企业服务器数据库遭到malox勒索病毒攻击后如何解决,勒索病毒解密
网络技术的发展不仅为企业带来了更高的效率,还为企业带来信息安全威胁,其中较为常见的就是勒索病毒攻击。近期,我们公司收到很多企业的求助,企业的服务器数据库遭到了malox勒索病毒攻击,导致系统内部的许多重要数据被加…...

udp与can通信的选择与比较
UDP(用户数据报协议)和CAN(控制器局域网)是两种不同的通信协议,它们在实时传递性上有一些区别。 UDP是一种无连接的传输协议,它提供了简单的、不可靠的数据传输。UDP不提供可靠性保证、流控制或重传机制。…...

HoudiniVex笔记_P24_ForceBasics力基础
原视频:https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili:Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili Houdini版本:19.5 1、什么是Force 本章主要讲重力、弹力、速度与质量、…...

半导体退火那些事(1)
1.半导体退火的原理 半导体材料在晶体生长和制造过程中,由于各种原因会出现缺陷、杂质、位错等结构性缺陷,导致晶格不完整,施加电场后的电导率较低。通过退火处理,可以使材料得到修复,结晶体内部重新排列,…...

MapReduce介绍
目录 一、什么是MapReduce 二、MapReduce 的设计思想 2.1 分而治之 2.2 构建抽象模型:Map和Reduce 2.3 隐藏系统层细节 三、MapReduce 的框架原理 3.1 MRv1工作原理 3.1.1 MRv1架构工作原理图 3.1.1.1 流程说明 3.1.1.1.1 作业的提交 3.1.1.1.2 作业的初始化 3…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...