常見的低效率之源—代碼大全

近來在看代碼大全這本書,寫寫摘要和讀後感,希望能與看官共分享


常見的低效率之源大概有這樣幾個

一 輸入輸出操作

     按照作者的話來說就是,如果你可以選擇在內存中處理文件,就不要費力的通過磁盤,數據庫,或是跨網絡訪問相同的文件,除非程序對內存佔用非常敏感,否則數據都應該放在內存中。

     由此,我想到很多大型互聯網公司都在採用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請求耗時

這個比較頭疼,想優化,沒有方向


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章