1、规范说明
性能是网站运行是否良好的关键因素,网站的性能与效率影响着公司的运营成本及长远发展,编写出高质高效的代码是咱们每一个开发人员必备的素质,也是咱们良好的职业素养。javascript
2、影响性能的因素
A、商业需求
- 需求合理性
- 需求与系统的整合
- 需求所带来的商业利益是否与需求开发的成本成正比
- 需求所带来的风险
B、Web 服务器
- 并发处理能力
- 高负载的能力
- 负载均衡的能力
- 动态内容与静态内容的处理能力
- Web 服务器部署
C、DataBase 服务器
- 并发访问
- 数据库服务器的部署
- 数据库的 shema 架构与的表设计是否合理
- 数据检索
D、操做系统
E、客户端请求
F、程序/语言
3、分析性能的指标
- 程序的运行时间
- 程序的运行所消耗的内存
- 单位时间内的并行处理
- 磁盘 IO 的处理
4、优化性能的目标
快速、并发、资源消耗低(内存、磁盘 IO、CPU 负载)php
5、优化性能的原则
- 服务器配配置最优化
- 服务器部署合理化
- 商业需求合理并与产出的商业价值成正比
- 架构可用、可维护、可扩展
- 程序的正确性、简单性、逻辑的合理性。
- 不断的分析性能的的瓶颈
- 不断的重构已有的代码
- 优化的优先级:program->database->web sersver->os->client
6、优化
A、程序优化
变量css
- 变量大小,注意变量大小是节约内存的最有效手段,对于来自用户表单、数据库和文件缓存的数据都须要控制变量的大小。由于cpu要处理的数据是来源于内存。
- 变量有效期,使用unset()函数注销不须要的变量是一种良好的习惯,将一些不须要的变量当即注销可提升内存的使用率。
- 复制变量,尽可能不要复制变量,不然就会带来1倍的内存消耗,即便复制变量也应该要当即注销原有变量。
- 变量类型,初始化变量请注意其变量类型,一个变量在执行过程当中最好只有一种类型状态。对于数组变量,请初始化声明,以下: $a = array();
- 临时变量,是处理业务逻辑的临时存储,这些都是须要消耗内存的。若是临时变量使用结束请当即注销,特别是在一些过程式代码的执行流程中,对于一些函数,若是业务很是复杂,一样须要当即注销临时变量。
- 静态变量,对于一些须要由复杂业务产生的变量,若是在程序的执行过程当中屡次产生并使用,可考虑使用静态变量,减小程序的cpu执行次数。
- 变量的性能:局部变量 > 全局变量 > 类属性 > 未定义的变量。
循环html
- 尽可能减小循环的次数。
- 尽可能减小循环的潜逃的层次,不要超过三层。
- 避免在循环内有过多的业务逻辑。
- 不要循环包含文件
- 不要循环执行数据库操做。
- 优先使用foreach,它比for/while效率高
- 不要把 count/strlen/sizeof 放到 for 循环的条件语句中 for($i=0,$count=count($array);$i<$count;$i++){} 不要使用for($i=0;$i<count($array);$i++){};
- for($i=$total;$i>0;$i–-){}性能好于for($i=0;$i<$total;$i–-){}
- 保持循环体内的业务逻辑清晰
函数前端
- 函数职责清晰,一个函数只干一件事,不要杂揉过多的业务逻辑
- 函数代码体不要超过20行,反之,考虑拆分。
- 优先使用php内置函数
- 常量与函数同时能干一件事,优先使用常量。phpversion() < PHP_VERSION,get_class() < __CLASS__,is_null() < NULL ===
- echo 的性能好于print,输入多个变量的时候用echo $str,$str1;不用.链接符
- $_SERVER[REQUEST_TIME]替换time();
- 字符串替换strtr()->str_replace()->preg_replace()->epreg();
- 发挥trim最大功效,替换substr。$filepath=trim($filename,'/').'/';
- isset/empty 虽然两个函数功能有所差别,但在一样的状况下推荐使用 empty()
- isfile/file_exist 两个函数的功能有所不一样,file_exist既可判断文件是否存在,也能够判断目录是否存在,在一样的状况下推荐使用is_file
文件java
- 减小文件包含数,减小磁盘 IO
- 使用完整路径,或者容易转换的相对路径。避免在 include_path 查找
- 文件的代码行数不要超过 2000 行
- Require_once/include_once 效率低于 require/include, 须要额外的去查看系统是否已经调用过这个文件. 由于它们在一个 opcode 缓存下的调用很是慢
- 程序执行文件用 requie/require_once,缓存文件用include/include_once。Include 效率好于 require
- 优化 spl 中的文件自动加载机制,可参靠 yii
- 类库文件加载,是否考虑类是否已经实例化,可考虑采用设计模式之单例模式
- 文件读写的并发性
面向对象c++
- 控制实例的建立的数量
- 优先使用常量、类常量
- 优先例用静态变量,静态属性
- 类的结构合理
- 面象接口编程
- 封装变化点
- 依赖于抽象,不依赖于细节
- 优先使用静态成员
- 类的接口清晰稳定,类的职责单一,类与类的通讯合理
- 使用常量的好处 编译时解析,没有额外开销 杂凑表更小,因此内部查找更快 类常量仅存在于特定「命名空间」,因此杂凑名更短 代码更干净,使除错更方便
字符串web
用单引号替代双引号引用字符串;避免检索字符串中的变量sql
运算数据库
- 用 i+=1 代替i=i+1。符合c/c++的习惯,效率还高
- ++$i 的效率高于 $i++,–-$i 同理
数组
- 多维数组尽可能不要循环嵌套赋值;
- 使用$array['name']方式访问数组,禁止$array[name]/$array["name"]
判断
- 逻辑判断请优先使用switch 的方式,对于业务逻辑相对较多的状况请选择if/else,提升代码的可读性
- 尽可能控制if/else判断的个数,若是太多请考虑功能优化或代码优化
- 尽可能使用恒等用于比较判断,恒等的效率高于等于,并且还能避免一些类型强制转换的错误
- if/else与_&&,单条语句判断请选择&&的形式, &&的效率高于if/else,以下 :
if ($a == 1) { $b = 2;}可选择为($a == 1) && $b = 2;
缓存
- 使用php加速器,缓冲opcode
- 例用memcache/nosql
- 使用内存数据库
- 使用文件缓存
- 缓冲功能
其它
- 少用@符号,严重影响性能
- 适时关闭远程资源链接如数据库,ftp、socket等,适时的清理这些资源
B、数据库优化
- 合理的商业需情
- 数据库 schema 架构优化
- 垂直与水平分库分表
- 索引优化,查询优化
- 第三方开源检索工具(sphinx)
- 主从数据库服务器的使用。
C、Web 服器优化(暂未整理,有相应的 Web 服务器优化手册)
D、操做系统优化(暂未整理,有相应的 OS 优化手册)
E、前端优化
- 合理的 html 结构
- 合理 html 与css 的同时,考虑 css 设计合理,减小 http 请求
- 合理 html 与 javascript 的同时,考虑拆分是否合理,减小 http 请求
- 优化 java script 代码,让用户有良好的体验
- 根据 http 协议,优化高并发请求
7、性能检测工具
- Web Server
- ab
- http_load
- PHP
- apd
- xdebug
- Mysql
- explain
- profiler