代碼優化對代碼的運行效率有沒有幫助?如果項目著眼于盡快無BUG上線,那麽此時可以抓大放小,代碼的細節可以不精打細磨;但是如果有足夠的時間開發、維護代碼,這時候就必須考慮每個可以優化的細節了,一個一個細小的優化點累積起來,對于代碼的運行效率絕對是有提升的。那麽,代碼優化有什麽竅門呢?
1、盡量指定類、方法的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String,整個類都是final的。爲類指定final修飾符可以讓類不可以被繼承,爲方法指定final修飾符可以讓方法不可以被重寫。如果指定了一個類爲final,則該類所有的方法都是final的。Java編譯器會尋找機會內聯所有的final方法,內聯對于提升Java運行效率作用重大,具體參見Java運行期優化。此舉能夠使性能平均提高50%。
2、盡量重用對象
特別是String對象的使用,出現字符串連接時應該使用StringBuilder/StringBuffer代替。由于Java虛擬機不僅要花時間生成對象,以後可能還需要花時間對這些對象進行垃圾回收和處理,因此,生成過多的對象將會給程序性能帶來很大的影響。
3、盡可能使用局部變量
調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧中速度較快,其他變量,如靜態變量、實例變量等,都在堆中創建,速度較慢。另外,棧中創建的變量,隨著方法的運行結束,這些內容就沒了,不需要額外的垃圾回收。
4、及時關閉流
Java編程過程中,進行數據庫連接、I/O流操作時務必小心,在使用完畢後,及時關閉以釋放資源。因爲對這些大對象的操作會造成系統大的開銷,稍有不慎,將會導致嚴重的後果。
5、盡量減少對變量的重複計算
明確一個概念,對方法的調用,即使方法中只有一句語句,也是有消耗的,包括創建棧幀、調用方法時保護現場、調用方法完畢時恢複現場等。
6、慎用異常
異常對性能不利。抛出異常首先要創建一個新的對象,Throwable接口的構造函數調用名爲fillInStackTrace()的本地同步方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被抛出,Java虛擬機就必須調整調用堆棧,因爲在處理過程中創建了一個新的對象。異常只能用于錯誤處理,不應該用來控制程序流程。
7、及時清除不再需要的會話
爲了清除不再活動的會話,許多應用服務器都有默認的會話超時時間,一般爲30分鍾。當應用服務器需要保存更多的會話時,如果內存不足,那麽操作系統會把部分數據轉移到磁盤,應用服務器也可能根據MRU(最近最頻繁使用)算法把部分不活躍的會話轉儲到磁盤,甚至可能抛出內存不足的異常。如果會話要被轉儲到磁盤,那麽必須要先被序列化,在大規模集群中,對對象進行序列化的代價是很昂貴的。因此,當會話不再需要時,應當及時調用HttpSession的invalidate()方法清除會話。
8、使用同步代碼塊替代同步方法
這點在多線程模塊中的synchronized鎖方法塊一文中已經講得很清楚了,除非能確定一整個方法都是需要進行同步的,否則盡量使用同步代碼塊,避免對那些不需要進行同步的代碼也進行了同步,影響了代碼執行效率。
代碼優化就好比大海里的鯨魚一樣,如果僅僅吃一條小蝦米是沒用的,但是如果吃的小蝦米多了,鯨魚也就偉飽了。同樣如果優化代碼時都考慮到每一個細節點,那麼對於運行速度是絕對有一定的幫助的。