1.预防

思想
培养好的思维习惯和编码规范,让计算机以合理的方式工作
业务设计
省时省力的把事情做完
把计算机当作“不会思考,记忆力、运算力超强”的傻子来看待
不能转化为数学问题 || 不适合计算机做的事情,不要交给它做
“记忆力、运算力”再强,仍然有限,不能完成超出能力范围的事情
程序设计
跑得快,好维护
综合考虑计算消耗、存储消耗、通信消耗
遵守设计原则,将程序设计成可适应已预见的变化
平衡资源消耗和可维护性,做出合理的选择
编码实现
能读懂,易修改
遵守代码规范,容易被人读懂
消除重复代码,降低维护工作量
设定规则,利用静态代码检查工具,提高代码质量

2.定位

思想
根据运行原理,分析可能引发性能问题的地方
客户端
分析页面加载时间
加载Html耗时:生成页面耗时长 || 页面包含冗余内容
加载外部资源耗时:资源多且体积大 || 网络环境差 || 服务器响应慢
渲染页面耗时:js效率低 || css效率低
工具:IE10,Chrome等浏览器自带的分析工具
服务器端
分析函数执行时间
调用第三方组件:使用方式不对 || 第三方组件有问题
与其它服务通信:通信链路慢 || 其它程序或服务响应慢
自实现的函数:算法速度慢 || 硬件配置不够
工具:VS2012自带的性能分析
数据库
分析sql执行计划
单表查询速度慢:数据量大 || 未建立合适的索引
多表查询速度慢:关联逻辑效率低 || 筛选逻辑效率低 || sql算法效率低
删除和修改速度慢:筛选逻辑效率低
写入单条数据速度慢:索引太多 || 表的字段太多 || 包含触发器
写入多条数据速度慢:批量写入方式效率低
工具:Sql Profiler

3.解决

思想
对症下药
生成页面耗时长
优化服务端的响应速度 || 增加进度提示
页面包含冗余内容
考虑精简或用其它方式存储
资源多且体积大
压缩、合并
网络环境差
购买带宽 || 使用CDN
服务器响应慢
提升服务器配置
js效率低
调试js,改进算法
css效率低
分析css,进行优化
第三方组件的使用方式不对
详细了解接口文档,改进调用方式
第三方组件有问题
更换组件
通信链路慢
更换通信硬件 || 尝试其它通信方式
其它程序或服务响应慢
与服务提供方沟通 || 更换服务
算法速度慢
优化算法(可尝试缓存 || 并行计算)
硬件配置不够
购买更高的配置
单表数据量大
分离历史数据
未建立合适的索引
根据查询特点,合理建立索引
关联逻辑效率低
调整表的关联次序 || 使用子查询 || 增加冗余字段、减少关联
筛选逻辑效率低
改进过滤条件
sql算法效率低
优化sql算法
索引太多
减少不重要的索引,平衡读写速度
表的字段太多
将字段拆分到2个表中
包含触发器
减少触发器的工作量 || 更换为程序方式实现
批量写入方式效率低
使用SqlBulkCopy等工具提升入库效率

4.常用手段:少干活

①按需所取
预加载
多个资源,肯定会用到;合并到一起加载,减少通信次数
懒加载
一个资源,不一定用到;用时再加载,减少无谓的消耗
分页
数据量太大,均匀切分;少量加载(懒加载的一种)
②复用
缓存计算结果
计算量很大,并且计算结果有限
缓存加载结果
加载很频繁,并且资源数量有限
③分时操作
冗余字段、单条计算
计算复杂 || 表的数据量大,并且使用率很高

5.常用手段:多找人

①分工
分布式
职责分给不同的组件,组件部署在各自的机器上
生产者消费者模式
对于异步操作,使用队列通信,协调调用组件和被调用组件
②加人
集群
同一个组件部署在多个机器上,由负载均衡服务器(“主管”)分工

1.基本术语

性能
软件系统对及时性的度量,用一系列指标来度量
性能测试
模拟用户使用的场景,获取性能指标
负载
系统当前的输入
容量
最大有效负载(最大输入,超出就不能承受了)
并发数量
同时发送请求的用户数量(其实就是负载)
负载敏感度
响应时间随负载变化的幅度(输入对输出在时间方面的影响)
效率
性能除以资源,反应系统整合资源的能力
响应时间
(请求 -> 完整应答)的时间
思考时间
用户在操作时,相邻操作之间的时间间隔
等待时间
什么都不做时,系统的响应时间(远程系统中的大问题)
响应性
用户对系统响应的感受(进度提示等,可以提高这种用户体验)
吞吐量
单位时间内处理的请求数量(体现系统的处理能力)
吞吐率
单位时间内,系统的吞吐量(输出)
TPS
Transaction Per Second,系统在1秒钟处理的事务数量
点击率
单位时间内,用户向服务器提交的请求数量
资源利用率
CPU、内存、硬盘、网络的使用情况
性能计数器
观察资源使用情况的工具,通过一些指标来反馈
可伸缩性
系统性能对资源的依赖性,也可以理解成系统对资源的利用能力(越强越好)

2.测试分类

负载测试
通过改变负载,观察系统的性能指标,找到最大负载。发现系统的缺陷,帮助改进性能
压力测试
在最大负载的情况下,处理业务的能力。测试系统稳定性
配置测试
调整系统运行的软/硬件环境,观察性能指标,找到系统的最优配置
并发测试
模拟用户并发访问,观察某个模块的性能指标
可靠性测试
在一定负载下,让系统持续运行一段时间,观察性能指标

3.测试目标

通过负载测试,了解系统能承受的最大负载
通过压力测试,了解在最大负载下的抗压能力
通过配置测试,了解在指定负载下,什么样的软/硬件配置,性价比最高
通过并发测试,了解单个模块的瓶颈
通过可靠性测试,了解系统在恶劣环境下是否够皮实

1.良医者,常治无病之病,故无病;圣人者,常治无患之患,故无患
2.性能问题的本质是:计算机做事情的方式不合理
3.工具的作用:呈现程序运行过程中的各项指标,协助分析者判断
4.注重“性价比”,从最大的性能瓶颈开始着手