性能提升:比 if 好用的查找表

280 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天。

有一种比 if-else 和 switch 更好用的条件查询语句,相信很多人都忽略了,那就是查找表。当有大量离散值需要测试的时候,就是查找表的用武之地了。

查找表的定义

给定一个由同一类型的数据元素(或记录)构成的集合,从中查找指定数据项(或数据元素某个特征)的数据元素或记录,这就是查找表。

我们可以使用数组和普通对象来构建查找表,通过查找表访问数据性能会提升2倍或以上。

优点

  • 速度快
  • 可读性好
  • 更适合离散数据

查找表的主要操作

  • 查询某个“特定的”数据元素是否在查找表中
  • 检索某个“特定的”数据元素的各种属性
  • 在查找表中插入一个数据元素
  • 从查找表中删去某个数据元素

实例

笨重的 switch 语句:

switch(value){
    case 0:
        return result0
    case 1:
        return result1
    case 2:
        return result2
    case 3:
        return result3
    case 4:
        return result4
    case 5:
        return result5
    case 6:
        return result6
    case 7:
        return result7
    case 8:
        return result8
    case 9:
        return result9
    case 10:
        return result10
}

swtich 表达式代码所占的空间与它的重要性不成比例,这个时候我们可以优化为查找表的形式:

// 将返回值集合存入数组
var results = [result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10]

// 返回当前结果
return results[value]

怎么样,是不是简单又明了,一秒钟就完成了复杂又又臃肿的代码。

使用查找表,我们可以不用书写任何条件判断语句,几遍候选值数量增加,也机会不会产生额外的性能开销。

当单个的键值存在逻辑映射的时候,查找表的优势就更加明显了。是不是很 nice ?!

题外话:switch语句更适合每个键都需要对应一个独特的动作或一系列动作的场合。