优化法则归纳为4个层次:
【1】减少数据访问(减少磁盘访问)
【2】返回更少数据(减少网络传输或磁盘访问)
【3】减少交互次数(减少网络传输)
【4】减少服务器 CPU开销(减少CPU及内存开销)
案例一:通过遍历List从数据库中获取数据进行处理,应当直接传入 List从数据库中一次性获取数据。
list.forEach( l -> {
...
// 从数据库中获取数据
Object o = dal.getInfoByIdList(l);
...
});
案例二:对从数据库中获取到的数据进行过滤筛选,应当直接返回需要的数据,减少数据量的传输。
// 从数据库中获取数据
List responseList = dal.getInfoByIdList(list);
if (responseList !== null && responseList.size() > 0) {
Object o = responseList.stream().filter(r -> r.status == 0 || r.status == 1).findFirst();
}
return o;
案例三:sql应当只查 count(id) 减少网络传输和磁盘访问
// 从数据库中获取数据 List responseList = dal.getInfoByIdList(list); return responseList.size();
关于DB使用注意的优化事项:
【1】正确使用索引,只通过索引查数据;查看复杂sql语句的执行计划,优化sql语句的执行计划,分页等。
【2】尽量不要使用存储过程,不要在sql中包含复杂的业务逻辑,尽量减少join。
代码优化法则:
【1】减少没必要的内存分配;
【2】减少没必要的计算;
【3】减少网络开销;
避免频繁进行内存回收,减少GC次数,特别是FULL GC
【1】避免随意使用静态对象,防止 Perm OOM;
【2】避免内存泄漏,如String 对象大量创建,队列消费速度跟不上生产速度,防止 Heap OOM;
【3】避免不必要的局部变量,减少 Young GC;
代码示例掌握自己所写代码的的时间复杂度和空间复杂度,掌握基本的数据结构和算法,知道常用的时间换空间或空间换时间的数据结构和算法
推荐看《算法导论》和《编程珠玑》
通过list遍历多次进行RPC调用,应该只进行一次RPC调用,将逻辑判断放到RPC服务层实现并返回。
// 每个 tag进行一次 RPC(memcache/db) black 调用 int count = (int) list.stream().map(r -> tagBI.Instance.getTagBlackByName(r)).filter(Objects::nonNull).count();
改进建议:
【1】开发经理或架构进行Code Review,加强Code Review力度;
【2】性能测试压力测试来发现性能问题;
【3】开发人员积极提升,扎实基础,学习技术;



