提交訂單效能優化系列之012-引入FutureTask
概括總結
引入FutureTask能提高併發度,相應就可以提升效能,這次測試的結是,提升了38.93%
(參考值)。它的缺點也很明顯,就是增加了程式碼的複雜度,不方便閱讀了,且對異常也要額外處理,而且大家對FutureTask也不是很熟悉。衡量利弊之後,我覺得是值得引入的。
012版本更新說明
這一版本找到了一個辦法來消除測試方法執行的順序帶來的誤差,即:使用一個隨機數來判斷先執行哪個方法。程式碼見這裡。
這一版本引入了FutureTask
。程式碼見這裡
測試結果
統計10次測試的平均值之後:
Version012FutureTask
提交每個訂單平均耗時的納秒數: 5020455
Version012Normal
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