近來在看代碼大全這本書,寫寫摘要和讀後感,希望能與看官共分享
常見的低效率之源大概有這樣幾個
一 輸入輸出操作
按照作者的話來說就是,如果你可以選擇在內存中處理文件,就不要費力的通過磁盤,數據庫,或是跨網絡訪問相同的文件,除非程序對內存佔用非常敏感,否則數據都應該放在內存中。
由此,我想到很多大型互聯網公司都在採用memcached,vanish等機制,去把熱點數據放進內存中,從而減少了對數據庫的訪問,對用戶來說,訪問更快,體驗性更好,對web的後端服務器來說,也減輕了很多壓力
二 分頁
舉個例子,一個程序員寫了一個初始化循環,這段程序在一個內存頁面大小爲4k的系統上將產生很多缺頁中斷
for ( $column = 0 ; $colum < MAX_COLUMS ; $column++ )
{
for ($row = 0 ; $row < MAX_ROWS ; $row++ ){
$table[$row][$colunm] = blankTableElement();
}
}
乍一看,代碼沒什麼錯誤,問題在哪?問題出在table中每一個元素都有大約4000字節長,如果該table的行太多,那麼每一次程序訪問不同的行元素的時候,操作系統都要進行頁交換,按照這樣的組織方式,每一次的數組訪問都需要切換所讀取的行,這就意味着每一次的數組訪問都會造成磁盤和內存之間的頁面交換
如果我們將內外層的for循環條件進行切換,雖然運行時仍然會引起缺頁中斷,但是隻會發生MAX_ROWS次,而不是原來的MAX_ROWS * MAX_COLOUMS次了,在一臺內存較少的機器上,改進後的代碼很有可能比第一段快上1000倍
三 系統調用
這一部分可總結爲,不要輕易去系統調用,能自己寫就自己寫吧
四 解釋型語言
我們比較一下編程語言的相對執行時間
一般來說,編譯型語言的執行速度比較快,當今比較流行的混合型語言開發,php適合開發web服務,後端的一些處理服務,如果需要高效的話,會使用c或者phthoy或者shell編寫
五 錯誤
常見的錯誤有,忘了去掉調試代碼,沒釋放內存,數據庫表設計失誤,輪詢 不存在的設備等等
寫到這,我要提醒自己,明天上班把數據庫表的索引加上
最後,總結一下最近檢查代碼發現的兩個性能瓶頸
一是防止XSS攻擊的代碼
它爲神馬成了瓶頸,因爲我的項目裏,有很多與用戶交互的操作,需要服務端對錶單數據進行過濾,每一個元素都要進行一通循環,去除標籤,去除關鍵字,替換特殊符號等等,在網上找的某個著名函數RemoveXSS經測試,耗時巨大,後替換成html purifier,經測試,比原來快20,000微秒,進步是有,但並不大
二是curl請求耗時
這個比較頭疼,想優化,沒有方向