优化原则:
1: 在能应付当前性能需求的情况下,不建议进行性能优化。
2: 仅仅优化性能瓶颈
3: 编码时必须进行压力测试
4: 优化时,考虑现实生活中遇到的问题,现实如何处理,代码也如何处理。
5: 优化的唯一方法:去掉没有必要的操作 和高效的算法。可以看到所有的优化方法都离不开这条原则,而最常用、也最容易发现的方案就是去掉没必要的操作。
代码优化
代码优化的唯一目的: 减少执行时间。
两种优化方法: 减少没必要的内存分配;减少没必要的计算。
当然这两种方法一般都会同时出现,如分配没必要的内存,分配这个操作就是没必要的计算。
内存分配:
最好的效果:一次申请正好足够的内存。不过一般都做不到,只能尽可能。
1:比如Java中的'+'进行字符串连接,不断产生新的char[]数组后又废弃不用。
2:避免频繁的内存回收,对某些大数据任务可以多分配内存,减少GC的次数。
计算:
计算一般涉及算法(数据结构)和缓存。
1:算法(数据结构)当然越快越好,比如:hashSet的搜索效率就比ArrayList高
2:不需要重新获取的东西就可以缓存起来,比如:处理过程中的中间结果
3:如果某些操作需要创建某些资源,比如网络连接。那么最好不要每次操作都创建一个,而是一个连接进行多次操作。
策略优化:
以不同的交互策略来达到用户一致的体验。
最常用的策略:当用户操作时才进行处理,将集中式处理改为分散式。
例子1:懒加载
比如一张单据有很多子页签,用户查看时单据仅仅加载单据的数据,而不需要加载子页签的数据。只有用户点击子页签时才加载对应的页签数据。
这样就将集中式的查询分散到用户操作中去,提高用户的体验并减少系统瞬间压力。
例子2:
这里借用一下JavaEye中别人讨论过的例子:
某个系统要求在某个时间将用户积分清零的需求。
最直接的方案:定时将系统中所有的用户积分清零。其弊端在于:如果系统用户量特别大,则在一小段时间内用户将不可进行积分操作。
优化后的策略:用户进行积分操作是分散的,同一时间进行积分操作的压力是很小。因此可以考虑在用户进行积分操作时才考虑是否进行积分清零。