1. 程式人生 > >提交訂單效能優化系列之012-引入FutureTask

提交訂單效能優化系列之012-引入FutureTask

概括總結

引入FutureTask能提高併發度,相應就可以提升效能,這次測試的結是,提升了38.93%(參考值)。它的缺點也很明顯,就是增加了程式碼的複雜度,不方便閱讀了,且對異常也要額外處理,而且大家對FutureTask也不是很熟悉。衡量利弊之後,我覺得是值得引入的。

012版本更新說明

這一版本找到了一個辦法來消除測試方法執行的順序帶來的誤差,即:使用一個隨機數來判斷先執行哪個方法。程式碼見這裡

這一版本引入了FutureTask。程式碼見這裡

測試結果

統計10次測試的平均值之後:

Version012FutureTask 提交每個訂單平均耗時的納秒數: 5020455

Version012Normal

提交每個訂單平均耗時的納秒數: 6975366

Version012FutureTask 每秒鐘可以提交的訂單數: 200

Version012Normal 每秒鐘可以提交的訂單數: 143

效能差別為:(6975366 - 5020455) / 5020455 * 100% = 38.93%,即:引入FutureTask後,效能提升了38.93%。 這已經是一個不錯的成績了。

【備註】:不同的機器上的測試結果會不一樣,以上測試結果僅供參考。

測試結果說明

對資料庫的插入和修改操作很費時,比查詢操作高出一個數量級。在提交訂單的7步操作中,有3步操作是涉及到插入與修改的,分別是:

第5步:儲存訂單到資料庫中,並返回訂單ID

第6步:儲存訂單商品到資料庫中

第7步:更新商品的庫存與銷量

這3步操作是同一個執行緒中是順序執行的。引入FutureTask的目的是:讓第5步操作與第7步操作並行執行。(注意由於第6步的操作依賴於第5步獲取的訂單ID,所以它必須在第5步的後面執行)。於是假設原本順序執行時每個操作需要1秒,共耗時3秒,則引入FutureTask以後,只需要2秒就可以完成。

補充說明

在查詢資料的過程中,有文章提到,FutureTask已經不推薦使用了,推薦使用的是CompletableFuture,參考這篇部落格:Java8新特性整理之CompletableFuture:組合式、非同步程式設計(七)

我自己測試了下CompletableFuture

,發現並沒有提升效能,反而下降了50%以上。但是考慮到我對這個類的用法並不熟練,可能是我寫的程式碼有問題,所以就沒有把測試程式碼提交到github上去,後來乾脆刪掉了。暫時不打算研究了。

原始碼