最近做了兩個事情相比在專案裡面寫CRUD有意思些,就是看一些優秀框架的源代嗎,然後發現問題並修改提交PR。因為SpringCloud元件Eureka的閉源,所有我們專案有必要看看其他相關的優秀開源的專案,剛好Alibaba Nacos這個開源專案現在比較火熱,所以我也花時間簡單的看了看他們的框架,有意思的是我在看原始碼的過程也發現了一些問題,加上我本人有程式碼潔癖,所以把我最不能忍的一個問題拎出來給修改了,並提交的PR給到Alibaba Nacos團隊review,最後Alibaba Nacos 團隊採用的我的修改建議併合並了程式碼。中間還有個小插曲,因為不知道給開源專案貢獻程式碼需要簽訂CLA,而有過幾次溝通。然而比較碰巧的是,我在檢視公司內部中介軟體團隊的程式碼時也發現的類似的可能會造成效能問題的程式碼,這也是促成我這今天隨筆的原因。
先說下我爭對公司中介軟體團隊的專案程式碼修改經歷,因為不太方便放專案的程式碼,所以只能簡單描述下,修改了什麼
虛擬碼大概如下: xxxx()..stream().forEach(e-> { addApi(e.getxxx())});
addApi(Api api) { versionMap.put(api.getVersionNumber(), new ArrayList<>(Arrays.asList(api))); } 主要修改的的是把 addApi() 方法裡面的 Arrays.asList 改為了 Collections.singletonList,原因Arrays.asList方法裡面走的是 new ArrayList()方法,而Collections.singletonList返回容量為1
的List,所以在這裡後者效能會更好。
另外一個就是Alibaba Nacos修改的程式碼,PR提交地址: https://github.com/alibaba/nacos/pull/2729/files,截圖如下,相信大家看了後很好理解,List.addAll方法是基於記憶體拷貝的所以相比來說效率更優
最後簡單總結下,上面兩個是都是java集合裡面的基礎知識,發現工作一段時間後回看下java基礎知識還是很有必要的。