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