上一篇谈了谈简单的前端的优化,这次就以下几点谈谈后端的优化。
书写时常见的。
- 循环里面不要走IO流。
走IO,是要对硬盘进读写操作的。就结论而言,硬盘的读写速度是低于内存的,比如说硬盘上读一次数据,需要1秒,内存里读一次数据需要0.1秒。那么如果对应的步骤执行10次、100次,从硬盘读取数据的时间就会成倍的增加。
常见的IO操作如:Excel的编辑、mysql的读取。 - 善用多线程。
这是由上述的情况延伸出来的。实际的开发工作中,确实有不得不进行循环中读写IO的情况发生。而硬盘的读写,会导致当前的线程阻塞,从而影响接口的执行,最后导致前端因为等待接口的返回而卡死。
这里我们不去管前端对于接口超时怎么处理。如果说因为读写IO导致当前线程阻塞,把这个需要耗费大量时间的任务,单独分一个线程去处理,让主线程继续执行并反馈结果是一种常见的解决方式。 - 循环的嵌套不要太多。
这个大家都知道,比如我有两个长度为100的数组A和B。如果循环是这样。
int[] a = new int[100];
int[] b = new int[100];
for(int i = 0 ; i < a.length; i ++){
for(int j = 0; j < b.length; j ++){
System.out.println("");
}
}
这相当于打印执行了10000次。但是如果换成这么写
int[] a = new int[100];
int[] b = new int[100];
for(int i = 0 ; i < a.length; i ++){
}
for(int j = 0; j < b.length; j ++){
}
两个循环加起来的处理也不过200次。
4. 编写时尽量小循环套大循环
这种情况多见于遇上条件处理的情况。比如
int[] a = new int[10];
int[] b = new int[100];
for(int i = 0 ; i < a.length; i ++){
for(int j = 0; j < b.length; j ++){
if(j == 10){
break;
}
}
}
如上述例子,如果j等于10 的时候,结束当前的循环。这样实际执行的循环次数会小很多。
实际工作中常见的。
- 结合公司的技术架构和业务做出取舍。
很多公司,实际的并发量并不大,服务器也只是单台。但是这种情况下有一种为了技术而技术的情况发生,例如:只有一台服务器,还要整什么分布式、负载均衡。这种说实话,多余的依赖反而会增加硬件的负担。因此,本着够用就行、留量应急的原则,应该去掉那些不必要的依赖。 - 多思考,尽可能把手头的技术在业务中用到极致。
很多东西的设计,都是在过程中才发现不是很适合。这种情况下应该好好分析一下业务。比如说大数据看板,在需求上看大致上是有实时性要求或者没有实时性要求的。这里用没有实时性要求的来举例。
一般来说,一个b/s架构的软件服务都是客户端发起请求到服务端,然后服务端去数据库里面逛一圈拿到数据,最后在响应到客户端。但是如果对实时性要求并不高的又不方便直接存在前端的,完全可以提前把这种数据存一份。需要的时候去取,并根据具体的业务,比如定时器每天24:00执行一次更新。