Java 求解如何优化 100 个 if 判断?

2022-11-07 21:04:51 +08:00
 whereisgungun
需求是这样的:
上游服务调用接口( TCP 协议,用 netty 做了服务端,上游是客户端)发来报文,这个报文里面会有 35 个属性,我们简单定义这 35 个属性为 A 、B 、C 、D....然后每个属性的值为 a 、b 、c 、d....现在有接近 100 个模板,然后我们的功能就是要根据报文来确定要用哪一个,重点是这 100 个模板是没有规律的。

比如:
if(a==1 && b==2) {return "模板 1";}
if(c.length==1 && d.equals("xxx")) {return "模板 2";}
...
也就是说,会有 100 个 if 判断来确定此次调用的报文对应哪个模板,而且报文是不冲突的,35 个属性的值只要命中其中一个模板,其他的就都不符合,都是互斥的。(算是 CompletableFuture 的 anyOf 方法。)

现在暂时找不出这 100 个 if 里面有什么具体的规律,35 个属性也没有。求问各位大神有什么好的思路优化吗?线程池 or 中间件?

PS:作为最底层的外包,也没法要求上游能做什么改动了。。他们是一个老旧的银行系统,以前也是用的一个一个判断来着,现在把项目丢给我们了。。
7662 次点击
所在节点    程序员
82 条回复
nightwitch
2022-11-07 21:09:21 +08:00
没规律的话 100 个判断是少不了的,只是写成 if 和写成函数的区别
hqs0417
2022-11-07 21:11:32 +08:00
可以考虑做个规则引擎,类似查表
secondwtq
2022-11-07 21:12:17 +08:00
你是想要优化结构还是优化性能?
ClericPy
2022-11-07 21:14:01 +08:00
本来还以为路径那样前缀树, 一看还有判断长短....


解释器模式搞个规则引擎吧
hidemyself
2022-11-07 21:15:27 +08:00
完全没规律如果后续也不会有什么改动,if 就可以了
whereisgungun
2022-11-07 21:16:35 +08:00
@nightwitch 是的。知道得写了。。就是想问问有什么技术方法可以加快一下判断,压榨机器。。
justNoBody
2022-11-07 21:16:57 +08:00
无意冒犯,但如果只是作为人力外包,且领导没有明确要求重构、或者不给重构工时、或者不给充分的测试时间,千万别改这这部分的代码,在这 100 个 if-else 之上写新的业务逻辑就行,这部分你可以适当设计一下。
whereisgungun
2022-11-07 21:17:13 +08:00
@secondwtq 主要还是性能
optional
2022-11-07 21:18:35 +08:00
统计下各个模板的频率,把常见的模板放最上面,可以提高性能
secondwtq
2022-11-07 21:18:52 +08:00
@whereisgungun 有相关数据的话就简单,找出每个请求走的哪个 if ,命中频率最高的排前面就行
whereisgungun
2022-11-07 21:22:46 +08:00
@optional
@secondwtq
感谢感谢,感觉还是得搞完之后再进行统计了
whereisgungun
2022-11-07 21:23:31 +08:00
@hidemyself
@justNoBody
是的,时间不够性能优化的话就只能往这坨东西上面继续拉了
whereisgungun
2022-11-07 21:24:04 +08:00
@hqs0417
@ClericPy
感谢,我去研究研究咋用
xyjincan
2022-11-07 21:29:03 +08:00
map 对象
PendingOni
2022-11-07 21:30:13 +08:00
#9 说的对,先把频率出现最高的放到最前面,之后用 swich 分组试试
sparky
2022-11-07 21:59:13 +08:00
可以试试决策树,有 java 开源实现,还可以可视化编辑,最终会生成一个 json 配置,可以实现规则和业务的分离
ajaxgoldfish
2022-11-07 22:00:42 +08:00
能不能多起几个线程
546L5LiK6ZOt
2022-11-07 22:06:01 +08:00
如果完全没有规律,那上游是怎么发报文的,也是 100 个 if ?我猜应该是有规律的,不然这一整条链路维护起来都很吐血。。。
pannanxu
2022-11-07 22:09:17 +08:00
直接枚举啊,一个参数是参数校验,一个参数是模板
seers
2022-11-07 22:26:16 +08:00
试试图那些算法,DFS 和 BFS ,感觉会有效果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/893424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX