性能优化(程序性能优化)

优化策略

不要过早进行优化???战略级的优化思路应在设计之初就创建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);