如何优化很多if else堆积的代码
Posted mu-zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优化很多if else堆积的代码相关的知识,希望对你有一定的参考价值。
项目开发初期的时候使用了简单的if else 逻辑做简单的路由判断;
后期路由很多的情况下,比如500,这个时候再进行比对性能会比较低;
假设我们的路由写的比较比较人性化,平均由二三个单词组成,多的时候5个单词,每个单词平均长度6个字符,加上分隔符,路由平均长度为20个字符,
长的有30个字符;
如果用if else 这种进行比较,就变成了字符串匹配, 最差情况比对到最后一个,然后宣布失败。
这种情况下字符比对的次数为20*200,
而路由又属于经常会访问的代码块;所以很有必要优化这一块的性能;
那么,如何提高性能呢?
方法1. 前缀树
将整个路由组织为一个前缀树map, key, 组建前缀树, value 定义为函数指针。这样,每次路由访问平均比较次数就是20次;
空间上如果路由比较稀疏,会存在空间利用率不高的情况,可以在路由上尽量紧凑一些;
方法2. 将路由转化为数值
将路由hash 后 作为case 的值, 将if else 代码结构变成switch case 结构。 每次比较都需要先将被匹配路由转化为数字;
所以如何构建hash 函数,将hash 冲突解决在代码生成的地方来降低二次匹配是一种值得考虑的方法。
这里使用了字符*Base 累加和的方法。尝试了多次,取到没有冲突的BAse 3。
但是base 3 ,为了简便运算取4进制。那么只能容纳64/4=16,最多16个字符长度;所以后续需要调整一下路由字符串
方法3. 直接用数字将路由代替
用数字代替,缺点:无含义,不人性。但是效率高
以上是关于如何优化很多if else堆积的代码的主要内容,如果未能解决你的问题,请参考以下文章