第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…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
