优化策略
不要过早进行优化???战略级的优化思路应在设计之初就建立
战略优化思路1
战略优化思路2
编码原则
代码优化的总目标
35条军规
附加
善用工具
什么是静态代码分析
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
1、下载 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);