从数据结构与算法看优秀编码习惯(二) | 青训营笔记

106 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

良好的代码风格和代码习惯无论是对团队合作还是程序效率都有着巨大帮助。本文将继续从一名算法竞赛选手的经历出发,以数据结构与算法的视角抛出一些优秀编码习惯的思考。

用好短路逻辑

大部分语言的分支语句(if)都有短路逻辑,具体表现为:

若连串逻辑与(AND, &&)遇到了假值(False), 则自动停止后续语句的执行, 直接判定为False

若连串逻辑或(OR, ||)遇到了真值(True), 则自动停止后续语句的执行, 直接判定为True

合理排布逻辑运算符两侧的语句,利用好逻辑短路的特性,可以提高代码执行的效率(虽然在渐近复杂度意义上没有变化)。例如在下面这段C代码中,我们将复杂度较高的dfs函数置于逻辑与的右操作数位置,这样当val的值不满足条件时,可直接跳转执行else分支中的语句,从而规避dfs的运行开销。

if (val < 30 && dfs(0)) {
    // do something
} else {
    // do other things
}

注意内存的分配策略

以C++为例,由于内存的线性性,高维数组不同维度的顺序会很大程度影响程序执行的性能,不妥当的内存排布会极大延长内存寻址的时间或提高缓存命中失效的概率,给程序性能带来瓶颈。这里引用一篇博文的论述,其中提出了应对高维数组的一种处理策略。

将循环次数多的维度放在外层,可减少一定的运行时间。高维数组在内存中都是线性安放的,在C语言中,按照的是行优先顺序,就像上面提到的,当我们使用行优先顺序遍历数组时,恰好就是顺次访问内存数据,会非常有利于CPU高速缓存的工作。

简洁与可读性可以兼得

过于简短或冗长的标识符都会影响开发效率。无意义的短标识符会严重伤害代码的可读性,而过于冗长的标识符则会拖慢代码review的时间,抬高共享时拼写出错的概率。

此外,杂乱的变量声明位置也会影响程序的可读性,最好是在一个作用域开始时,将所需的变量,闭包函数等标识符分类集中声明,并用一个空行和逻辑代码分割开。

本文介绍了一些小但重要的编码习惯,他们无论是对执行还是开发效率都有一定益处。