陪玩系統原始碼利用介面非同步呼叫,減少介面耗時
隨著陪玩系統原始碼中業務功能的發展,底層資料量越來越大,業務邏輯也日趨複雜化,某些介面耗時也越來越長,這時候介面就需要進行效能優化了,當然效能優化主要跟陪玩系統原始碼業務相關涉及改造點可能各不相同,這裡就來介紹非同步呼叫多個介面減少響應時間。
適用條件
-
呼叫多個獨立的介面,介面間無相互依賴關係
-
非耗時最大的介面占總耗時比重較大
優化前呼叫方式
優化前的陪玩系統原始碼按照順序呼叫方式:
import lombok.extern.slf4j.Slf4j; @Slf4j public class DemoTest { public static void main(String[] args) throws Exception { long beginTime = System.currentTimeMillis(); int processA = new InterfaceA().process(); int processB = new InterfaceB().process(); int result = processA + processB; log.info("執行結果:{} 耗時:{}", result, System.currentTimeMillis() - beginTime); } @Slf4j public final static class InterfaceA { Integer result = 1; public int process() { long beginTime = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (Exception e) { log.error("InterfaceA.process Exception"); } log.info("執行介面InterfaceA.process 耗時:{}ms", System.currentTimeMillis() - beginTime); return result; } } @Slf4j public final static class InterfaceB { Integer result = 1; public int process() { long beginTime = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (Exception e) { log.error("InterfaceB.process Exception"); } log.info("執行介面InterfaceB.process 耗時:{}ms", System.currentTimeMillis() - beginTime); return result; } } }
執行結果:
21:40:17.603 [main] INFO DemoTest$InterfaceA - 執行介面InterfaceA.process 耗時:2002ms 21:40:19.612 [main] INFO DemoTest$InterfaceB - 執行介面InterfaceB.process 耗時:2001ms 21:40:19.613 [main] INFO DemoTest - 執行結果:2 耗時:4018
優化後呼叫方式
優化後的陪玩系統原始碼按照非同步呼叫方式:
import cn.hutool.core.thread.ThreadFactoryBuilder; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Slf4j public class DemoTest { private static ThreadPoolExecutor pool = new ThreadPoolExecutor( 5, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000), ThreadFactoryBuilder.create().setNamePrefix("執行緒名稱-").build() ); public static void main(String[] args) throws Exception { long beginTime = System.currentTimeMillis(); List<Future<Integer>> futures = new ArrayList<>(2); List<Integer> results = new ArrayList<>(2); futures.add(pool.submit(() -> new InterfaceA().process())); futures.add(pool.submit(() -> new InterfaceB().process())); for (Future<Integer> item : futures) { results.add(item.get()); } int result = results.get(0) + results.get(1); log.info("執行結果:{} 耗時:{}", result, System.currentTimeMillis() - beginTime); } @Slf4j public final static class InterfaceA { Integer result = 1; public int process() { long beginTime = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (Exception e) { log.error("InterfaceA.process Exception"); } log.info("執行介面InterfaceA.process 耗時:{}ms", System.currentTimeMillis() - beginTime); return result; } } @Slf4j public final static class InterfaceB { Integer result = 1; public int process() { long beginTime = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (Exception e) { log.error("InterfaceB.process Exception"); } log.info("執行介面InterfaceB.process 耗時:{}ms", System.currentTimeMillis() - beginTime); return result; } } }
執行結果:
22:03:43.180 [執行緒名稱-1] INFO DemoTest$InterfaceB - 執行介面InterfaceB.process 耗時:2004ms 22:03:43.180 [執行緒名稱-0] INFO DemoTest$InterfaceA - 執行介面InterfaceA.process 耗時:2004ms 22:03:43.190 [main] INFO DemoTest - 執行結果:2 耗時:2020
強大的CompletableFuture JDK1.8
import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @Slf4j public class DemoTest { public static void main(String[] args) throws Exception { long beginTime = System.currentTimeMillis(); CompletableFuture<Integer> interfaceFuturesA = CompletableFuture.supplyAsync(() -> new InterfaceA().process()); CompletableFuture<Integer> interfaceFuturesB = CompletableFuture.supplyAsync(() -> new InterfaceB().process()); CompletableFuture<List<Integer>> future = CompletableFuture .allOf(interfaceFuturesA, interfaceFuturesB) .thenApply((none) -> { List<Integer> dataList = new ArrayList<>(2); try { dataList.add(interfaceFuturesA.get()); dataList.add(interfaceFuturesB.get()); } catch (Exception e) { log.error("執行異常"); } return dataList; }).exceptionally(e -> Lists.newArrayList()); int result = future.get().get(0) + future.get().get(1); log.info("執行結果:{} 耗時:{}", result, System.currentTimeMillis() - beginTime); } @Slf4j public final static class InterfaceA { Integer result = 1; public int process() { long beginTime = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (Exception e) { log.error("InterfaceA.process Exception"); } log.info("執行介面InterfaceA.process 耗時:{}ms", System.currentTimeMillis() - beginTime); return result; } } @Slf4j public final static class InterfaceB { Integer result = 1; public int process() { long beginTime = System.currentTimeMillis(); try { Thread.sleep(2000); } catch (Exception e) { log.error("InterfaceB.process Exception"); } log.info("執行介面InterfaceB.process 耗時:{}ms", System.currentTimeMillis() - beginTime); return result; } } }
執行結果:
22:31:44.822 [ForkJoinPool.commonPool-worker-5] INFO DemoTest$InterfaceB - 執行介面InterfaceB.process 耗時:2005ms 22:31:44.822 [ForkJoinPool.commonPool-worker-3] INFO DemoTest$InterfaceA - 執行介面InterfaceA.process 耗時:2002ms 22:31:44.831 [main] INFO DemoTest - 執行結果:2 耗時:2027
優化時注意點
-
在陪玩系統原始碼進行介面非同步呼叫時,可以使用執行緒池防止記憶體溢位風險
-
陪玩系統原始碼的執行結果容器可自行根據需要設定
-
介面粒度可根據實際業務情況組合和拆分
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2843152/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 陪玩原始碼介面效能優化,需要你掌握的關於呼叫的一些事原始碼優化
- 遊戲陪玩系統開發,日期時間選擇介面的實現遊戲
- 後續更新 | 減少使用非 SDK 介面以提升穩定性
- 做好陪玩系統原始碼的前端效能優化,提升系統效能原始碼前端優化
- 陪玩系統原始碼開發,H5頁面中呼叫支付功能的實現原始碼H5
- 陪玩原始碼下單介面調優實戰,提高效能的好辦法原始碼
- 呼叫支付介面,實現直播帶貨系統原始碼的線上支付原始碼
- 如何實現遊戲陪玩系統原始碼前端效能監控?遊戲原始碼前端
- 陪玩系統原始碼實現音訊編碼的相關步驟原始碼音訊
- 陪玩原始碼,與時間、日期相關的程式碼分析原始碼
- 從比心APP原始碼的成功,分析陪玩系統原始碼應該如何開發APP原始碼
- 經過4次優化我把python程式碼耗時減少95%優化Python
- 探究 | App Startup真的能減少啟動耗時嗎APP
- 關於遊戲陪玩系統原始碼後臺管理系統,需要思考的二三事遊戲原始碼
- 如何在遊戲陪玩系統原始碼中實現“刮刮樂”效果?遊戲原始碼
- 不一樣的遊戲陪玩原始碼服務端介面設計模式,值得一看遊戲原始碼服務端設計模式
- 如何開發陪玩系統原始碼的列表頁面,相關實現程式碼原始碼
- vue中axios非同步呼叫介面的坑VueiOS非同步
- 帶你瞭解遊戲陪玩系統原始碼前端常用的儲存方式遊戲原始碼前端
- 陪玩系統原始碼中陣列去重的實現程式碼,簡單卻重要原始碼陣列
- 陪玩系統原始碼中mysql資料庫備份還原的實現程式碼原始碼MySql資料庫
- Dubbo原始碼分析(十)同步呼叫與非同步呼叫原始碼非同步
- 如何在遊戲陪玩系統原始碼中聊天室內實現一個禮物系統?遊戲原始碼
- 陪玩系統原始碼開發,不懂資料庫隔離級別的請進原始碼資料庫
- 遊戲陪玩系統原始碼中不同排序演算法的實現方式遊戲原始碼排序演算法
- 陪玩系統原始碼移動前端開發需要注意的20個要點原始碼前端
- 教你實現快應用storage介面同步呼叫
- 利用Swagger UI介面文件同步本地Mock資料SwaggerUIMock
- 如何進行遊戲陪玩系統原始碼中音視訊的自動化測試?遊戲原始碼
- 遊戲陪玩系統原始碼中懶載入的實現方式有哪幾種?遊戲原始碼
- 介面呼叫超時的實現原理
- 介面1原始碼分析原始碼
- app 呼叫介面APP
- webservice介面呼叫Web
- 【Python】Python 使用http時間同步設定系統時間原始碼PythonHTTP原始碼
- 語音陪玩原始碼如何做到不卡頓?原始碼
- 遊戲陪玩系統原始碼開發,如何實現圖片和動畫的優化?遊戲原始碼動畫優化
- 開啟系統介面/軟體介面