不要過早進行優化???戰略級的優化思路應在設計之初就創建java
戰略優化思路1git
戰略優化思路2github
代碼優化的總目標緩存
35條軍規異步
附加分佈式
什麼是靜態代碼分析
靜態代碼分析是指無需運行被測代碼,僅經過分析或檢查源程序的語法、結構、過程、接口等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現的空指針引用等等。
在軟件開發過程當中,靜態代碼分析每每先於動態測試以前進行,同時也能夠做爲制定動態測試用例的參考。統計證實,在整個軟件開發生命週期中,30% 至 70% 的代碼邏輯設計和編碼缺陷是能夠經過靜態代碼分析來發現和修復的。
可是,因爲靜態代碼分析每每要求大量的時間消耗和相關知識的積累,所以對於軟件開發團隊來講,使用靜態代碼分析工具自動化執行代碼檢查和分析,可以極大地提升軟件可靠性並節省軟件開發和測試成本。ide
一、下載 pmd-bin-6.2.0.zip
(https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.2.0/pmd-bin-6.2.0.zip)
2.解壓到:相似於: C:\pmd-bin-6.2.0
3.添加到環境變量Path 臨時處理:SET PATH=C:\pmd-bin-6.2.0;%PATH%
4.命令行處理: pmd.bat -d c:\src -R java-basic -f text工具
它的能力:
可能的bug——try/catch/finally/switch 語句中返回空值。
死代碼—— 未使用的局部變量、參數、私有方法。
不理想的代碼—— 使用String/StringBuffer 。
過於複雜的表達式—— 沒有必要使用if 語句、while 循環能夠代替for 循環。
重複代碼—— 複製/ 粘貼的代碼引起的bug 。
PMD 集成了JDeveloper, Eclipse, JEdit, JBuilder, BlueJ, CodeGuide, NetBeans,IntelliJ IDEA, TextPad, Maven, Ant, Gel, JCreator, 以及 Emacs 性能
2. FindBug from http://findbugs.sourceforge.net
FindBug 是一個使用靜態方法來查找Java 代碼漏洞的程序測試
3.Checkstyle http://checkstyle.sourceforge.net/
Checkstyle是一款檢查Java程序源代碼樣式的工具,它能夠有效的幫助咱們檢視代碼以便更好的遵循代碼編寫標準,特別適用於小組開發時彼此間的 樣式規範和統一。Checkstyle提供了高可配置性,以便適用於各類代碼規範,因此除了使用它提供的幾種常見標準以外,你也能夠定製本身的標準。 Checkstyle提
供了支持大多數常見IDE的插件,大部分插件中就含有最新的Checkstyle。
Windows->prefences->checkstyle:
異步開發
定時器,使用間隔的查詢,合理的脫耦
外部請求(短信等),使用線程池確保請求可以快速的響應
•1)newCachedThreadPool 是一個可根據須要建立新線程的線程池,可是在之前構造的線程可用時將重用它們。對於執行不少短時間異步任務的程序而言,這些線程池一般可提升程序性能。調用 execute() 將重用之前構造的線程(若是線程可用)。若是現有線程沒有可用的,則建立一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。所以,長時間保持空閒的線程池不會使用任何資源。注意,可使用 ThreadPoolExecutor 構造方法建立具備相似屬性但細節不一樣(例如超時參數)的線程池。
•2)newSingleThreadExecutor 建立是一個單線程池,也就是該線程池只有一個線程在工做,全部的任務是串行執行的,若是這個惟一的線程由於異常結束,那麼會有一個新的線程來替代它,此線程池保證全部任務的執行順序按照任務的提交順序執行。
•3)newFixedThreadPool 建立固定大小的線程池,每次提交一個任務就建立一個線程,直到線程達到線程池的最大大小,線程池的大小一旦達到最大值就會保持不變,若是某個線程由於執行異常而結束,那麼線程池會補充一個新線程。
•4)newScheduledThreadPool 建立一個大小無限的線程池,此線程池支持定時以及週期性執行任務的需求。
緩存及工具
堆緩存,Guava Cache 、EhCache 、MapDB
堆外緩存, Guava Cache 、EhCache 、MapDB
磁盤緩存, EhCache 、MapDB
分佈式緩存,Redis
Guava示例
Cache<String,String>myCache= CacheBuilder.newBuilder().concurrencyLevel(4).expireAfterWrite(10,TimeUnit.SECONDS) .maximumSize(10000).build();
EhCache示例
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true); CacheConfigurationBuilder<String,String> cacheConfig= CacheConfigurationBuilder .newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.newResourcePoolsBuilder().heap(100,EntryUnit.ENTRIES)) .withDispatcherConcurrency(4) .withExpiry(Expirations.timeToLiveExpiration(Duration.of(10,TimeUnit.SECONDS))); Cache<String, String> myCache = cacheManager.createCache("myCache",cacheConfig);