龙空技术网

代码优化的一些经验和心得

银鸽class 137

前言:

眼前我们对“良好代码规范的收获和体会和感悟”可能比较关心,姐妹们都需要剖析一些“良好代码规范的收获和体会和感悟”的相关内容。那么小编同时在网上网罗了一些有关“良好代码规范的收获和体会和感悟””的相关知识,希望兄弟们能喜欢,姐妹们一起来了解一下吧!

作为写了8年代码的老程序员,我想和大家分享一下个人对于写好代码和优化代码方面的一些经验和心得。

我也带过形形色色不少人了,一直秉持着传道受业解惑的带人原则,坚持教人必须教会的初心,一直也在努力尝试各种带人的方式方法。之前遇到特殊问题就针对特殊问题专门讲解怎么去优化和对应的思路是什么,没有形成一个规范的记录,现在趁有时间,记录总结一下。

常用的编程语言:PHP、Javascript、Vue、Java

常用的开发框架:Laravel、SpringBoot

常用的中间件:Redis、Kafka

常用的数据库:Mysql、MongoDB

常用的服务端:Nginx

做好代码优化,有个重要的前提:扎实的基本功!

一、代码规范

这里牵涉到有一个编码准则,不需要过于苛刻,但是必须要有。正所谓无规矩不成方圆,有了规范,自己的编码会遵循一个准则,那么不管任何时候,都是有个条理在那儿。

编码准则可以是公司的准则,也可以是个人制定的一个准则。在公司团队中开发,一般团队会给出某种编程语言的开发规范,大家都按照规范走,一方面编码行为统一管理,另一方面出现问题也是能够快速定位。

二、代码注释

对于一个不管是简单还是复杂的功能开发,代码注释都非常重要。而往往有些人在开发时就很不屑或者不想着去编写注释,其实这会给团队的其他人带来很多困扰,因为你不能保证你的模块或者你的编码永久不出问题,当你的模块出现问题而又需要别人去修改时,拿到一堆天书般的代码,你想想你的队友会是什么样的心情?

清晰的代码注释,不仅可以在编写注释时帮助自己理清一些逻辑和思路,同时也是为了将来做打算。可能你这段代码很长时间都没出问题,但是保不准哪次就出现了BUG,如果之前的注释很清楚,那么对于你重新梳理这块的逻辑也是非常有帮助。

三、编码过程中时刻想着优化

大多数人只是想着按照工期把功能开发完了就算完事儿了,所以很多时候导致的情况就是这块功能的确是能够跑起来没问题,但是仍然是可以进行优化的,而他选择了忽视。作为程序开发人员,榨取最后一点性能是编程的信条,得有把一件事儿做到极致的追求精神!

如果图省事省力,后续出现问题再对当前的代码段做优化,那将会是更加耗时耗力的工作。

另外有些人可能会有误区,认为复杂的功能才会需要去优化,NO!只要是你写出来的代码,都是有可能需要优化的,无关功能复杂度!

四、代码优化举例

1、多余的中间变量可以省去

这块是编程过程中,如果很有意识的情况下会去主动避免的,如果平时就没这个意识和习惯,很容易整出一些过多无用的中间变量。(这个需要掌握代码运行相关的内存管理知识,对象、全局变量、局部变量,堆和栈)

//比如我这里只是想要打印一下a,但是我做了一个赋值操作,而这个赋值操作后面都没有用到var a = 1;var b = a;console.log(a);//又比如写循环处理时经常遇到临时变量问题function badFunc() {  for (int i=0; i<10; i++) {    Object a = new Object();    //业务处理  }}function goodFunc() {  Object a = null;  for (int i=0; i<10; i++) {    a = new Object();    //业务处理  }}//有时程序员也会写出来这样的代码,这样会可能产生重复计算问题for (int i = 0; i < list.size(); i++){...}建议替换为:for (int i = 0, length = list.size(); i < length; i++){...}

2、编写函数时,将参数校验优先,重要的判断优先

1、一般人都会先对参数进行校验,只不过校验的参数顺序可能不会或者很少关心,这里有个原则就是“重要的必须的先校验,出现问题比较高的先校验”

2、需要前置处理的放在执行逻辑之前全部做好

2.1:badMultiCreate是95%的程序员都会这样去写,因为逻辑简单,也符合平时的编码惯性—过程式思维。

2.2:goodMultiCreate同样实现了批量插入,但是做了代码优化,规避了几个问题

2.2.1:若按照badMultiCreate实现逻辑,假设有1000条,假设可能在第999条出现问题了,那么前面就操作了998次数据库操作,到最后都是废弃掉的

2.2.2:badMultiCreate中的流水号的一次次获取,而goodMultiCreate则按需一次获取一个偏移量,然后再循环逐个分配

2.2.3:badMultiCreate中是一条条保存的,而goodMultiCreate则按批量插入只操作一次数据库

/*** 举个例子,比如设计一个批量插入函数,要求对于每个数据包做格式校验检查,每条数据生成好流水号* 以下示例一个伪代码* 1、假设流水号增量为1* 2、假设单条数据保存方法为save,一次性插入多条为saveMulti*///不好的实现function badMultiCreate(List<Map> data) {    try {        for(Map dt: data) {            //检查数据包每个参数格式            if (!check()) {                throw new Exception("数据出现格式问题");            }                         //生成流水号            String seqno_id = makeSeqno();            dt.put(id, seqno_id);            //保存单条数据            Entity.save(dt);        }    } catch(Exception e) {        Log.info(e.message);                return {code:500, message: e.message};    }        return {code:200, message: 'ok'};}//好的实现function goodMultiCreate(List<Map> data) {    for(Map dt: data) {        //检查数据包每个参数格式        if (!check()) {            return {code:500, message: "数据出现格式问题"};        }        //生成流水号        String seqno_id = makeSeqno();        dt.put(id, seqno_id);        Entity.save(dt);    }        //获取数据的条数    int size = data.size();        //一次性获取size跨度的流水号    int lastSeqnoNumber = makeSeqno(size);        //循环分配流水号    for(Map dt: data) {        dt.put(id, --lastSeqnoNumber); //每次流水号减一    }        try {        //批量插入数据        Entity.saveMulti(dt);    } catch(Exception e) {          Log.info(e.message);                return {code:500, message: e.message};    }        return {code:200, message: 'ok'};}

3、避免过多的折腾数据库

3.1:数据库都是磁盘操作,不管怎样,产生IO操作都会影响到效率。所以如果没有必要的话,尽量不要去折腾数据库。

//比如下面这段伪代码,注册用户成功之后,返回用户id。假设save方法返回的就是注册成功之后的id,但是下面那段代码又再次查询了一下数据库。String user_name = "zhangsan";//查询用户名是否已经注册userService.check(user_name);//如果没有,则注册新账户String user_id = userService.save(userData);//根据用户名查询账户信息User user = userService.find(user_name);return user.id;

3.2:考虑到一些固化的但又经常查询的数据,可以考虑放到缓存里面。内存的效率要远高于磁盘。

4、对于缓存的使用

1、服务端缓存

· 1.1:一般使用redis这样的中间件,缓存虽好,但是也不能贪用哟,需要考虑缓存的一致性

1.2:如果某项数据是频繁更新的,甚至跟直接查询数据库效率差不多了,那就没必要使用缓存

1.3:掌握更新缓存的时机和方法(比如数据更新之后异步推送更新缓存)

2、前端页面缓存

2.1:利用nginx可以做到先寻找静态页面,然后在没找到静态页面的情况下,再走实时的页面控制器

3、数据库操作

3.1:一般都会使用连接池。(这里需要结合服务器硬件环境,设置好连接池的配置)

3.2:依据实际情况,设置好最小连接数,过多也会造成资源浪费(维护连接池也需要CPU开销)

5、结合数据库编程

5.1:检查自己的SQL语句是否符合规范,有没有走索引

5.2:若是自己手工原生创建数据库连接,一定要记得使用完之后关闭连接

6、结合服务器架构编程

6.1:现在的服务器架构都是分布式的了,考虑分布式情况的代码问题

6.2:利用apache的ab工具或者Jmeter工具等,可以事先对有性能要求的代码进行压测观察和分析

7、结合网络编程

7.1:能够减少网络传输的数据大小,尽量去控制(比如对一个大的Json包转成json字符串,再到服务端处理)

7.2:能够合并的接口请求尽量合并到一起,减少网络开销

7.3:常量数据,请求一次接口即可,避免重复请求

------------------- 结语 -------------------

最后,做好代码优化,除了平时去夯实自己的基本功外,还需要从平时的项目实践中去归纳总结,形成自己的方法论。方法论是一个实践体系,是解决一些问题的逻辑抽象,能够做到以不变应万变。平时还是需要自己多留心多揣摩多实践,代码只要多去写多去看运行效果,才能做到熟能生巧,把一些理论通过实践之后记忆到脑海里!

这里无法穷举更多的代码优化示例,其实掌握好一些基础知识,比如内存管理,垃圾回收、代码运行机制、代码规范、编程语言特性、数据库编程、网络编程等等,基础知识足够好的话,自然而然的会在编程过程中注意到代码运行的质量和性能问题。

标签: #良好代码规范的收获和体会和感悟