某個tomcat的系統,java開發。其中一個功能是,選中其中“一棵樹”,把它的內容插入到另外一個完整的“樹”,或者“森林”中。對于在同一層上的相同節點進行合并,比如樹上的id標識了相同的節點標記,相同的進行合并,以保持樹的完整性。
這個算法執行的時間將近120秒才能完成,當節點比較多的情況下。
首先,我們看性能消耗在哪里。
1) 查看單個sql語句的時間有多少。我們發現執行單個sql語句的時間很少,瓶頸應該不是在這里;
2) 查看單個簡單程序的執行時間,算法本身也很快,消耗時間并不多;
3) 但是,我們發現,這個操作,執行sql語句的次數,有幾百次?。?!
再仔細查看程序代碼,使用一個比較復雜的樹,發現sql語句執行的太多了?。?!很多循環中包含了sql語句,并且沒有prepare。
問題的根源在于,我們把數據庫當成了內存,做存儲和計算來使用,這樣就存在大量的sql語句來訪問數據庫。這個算法的問題就在于此。如果把數據庫訪問操作改造成內存操作,那么會怎么樣?
于是,我們改造了一下,大概2個小時完成,從幾百次sql語句,降低到三次!
執行速度,從120秒,降低到2秒?。?!
回顧一下我們的調優過程:
1, 計時。就是分段計算每一段算法所消耗的時間;
2, 分析sql語句執行的速度,看是否正常;
3, 分析算法緩慢的原因。
4, 制訂改進的解決方案,并且實施。
5, 重新測試,以檢查性能測試調優改進是否達到了目標。
推薦閱讀: