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:作为最底层的外包,也没法要求上游能做什么改动了。。他们是一个老旧的银行系统,以前也是用的一个一个判断来着,现在把项目丢给我们了。。
7356 次点击
所在节点    程序员
82 条回复
CEBBCAT
2022-11-07 22:38:15 +08:00
无非是些 if-else ,怎么会有性能问题呢?
楼主的文字我都读了,但是总是不敢相信事实就是我理解的那样。假如这 35 个 field 之间几乎没有关系(除了文中提到的 c 、d )

我认为现在楼主的诉求还是不明确,对问题的理解,或者说抽象还是不到位。为避免 XY 问题,楼主可否再多透露些细节?

如果不方便的话,我认为有两个要点,一个是提高可维护性,上百个 if-else 会把人搞得头晕脑胀,不沐浴焚香在脑袋里装图灵机是 hold 不住这样的代码的。另一个是防止业务人员提错需求,维护人员照做之下产生逻辑覆盖错误
billlee
2022-11-07 22:43:57 +08:00
没有什么好有优化的,我做过规则引擎,100 个 if 编译出来的结果是运行速度最快的。
jeesk
2022-11-07 22:48:34 +08:00
@seers 请教一下,dfs, bfs 如何应用到这种判断上去?

说说我的看法, 要么用有优先级的过滤器判断, 要么就 if else.
wangritian
2022-11-07 23:01:39 +08:00
别动,别动,别动
Hurriance
2022-11-07 23:41:19 +08:00
不用优化吧。优化后有回归测试的成本和发布风险,每个 if 写好注释,我觉得就可以了
graptioute
2022-11-07 23:45:19 +08:00
表驱动编程
JohnBull
2022-11-07 23:49:11 +08:00
Erlang 的 pattern matching 最善于处理这种逻辑
shyangs
2022-11-08 00:02:29 +08:00
對方是「老舊」的銀行系統,

如果需求已經「固定」,這些條件屬性範本都不會再更動,

那直接 if-else 性能應該是最高的,絕對比你用函數跳轉高。
fkdog
2022-11-08 00:10:21 +08:00
这 100 个 if ,我就想单测能不能覆盖到所有的 case 。。。
oneisall8955
2022-11-08 00:10:28 +08:00
JAVA 的话,可以把条件+模板组合封装成 Predicate ,用 stream.filter 出匹配到的,但这对性能没有优化
allenzhangSB
2022-11-08 00:17:32 +08:00
你一百多个 if else 能有什么性能问题?
night98
2022-11-08 00:20:20 +08:00
你要搞清楚你调整代码的目的是啥,是更好的性能还是更好的可读性,还是更好的可修改性。更好的性能就是拆成三五个 func ,并发去调。可读性就是拆成枚举直接遍历,枚举里放判断的 func ,可修改性同上,加个 unit test 完事,要是没这些需求就别动,慢慢往上加 if 吧
aguesuka
2022-11-08 00:36:30 +08:00
@optional 按照楼主说的报文不冲突, 命中其中一个模板, 其他都不符合, 改顺序会影响结果.
c0xt30a
2022-11-08 07:10:57 +08:00
1. 别动
2. 表驱动
3. 代码自动生成
sorcerer
2022-11-08 07:46:45 +08:00
if else 优化口诀
互斥条件表驱动
嵌套条件校验链
短路条件早 return
零散条件可组合
opengps
2022-11-08 09:15:15 +08:00
才 100 个,及即使按照高频率靠前优化了,效率也不会明显提升的,仅仅是少 100 个 if (假设条件里不带消耗性能的转换),测试不出来明显的感受。楼主跑个 1000 万次看看总时间,就知道效率优化有多小了
allenzhangSB
2022-11-08 09:29:50 +08:00
@night98 就 100 多个 if 判断, 多线程只会变慢
312ybj22
2022-11-08 09:32:07 +08:00
你先把规则进行统计,用规则树的形式进行统计(条件桩,条件项等),然后把规则写到规则引擎中(drools), 可以用数据脚本的形式,或者 excel 的形式。 这对于条件判断来讲就够了,当然我说的都是纸上谈兵,关键是能不能落地到你的业务体系中,你可以试试看,弄好的话还可以出去吹吹牛
summerLast
2022-11-08 09:37:52 +08:00
责任链
debuggerx
2022-11-08 09:46:45 +08:00
有些人真是设计模式学傻了吧,问题的关键在于“优化 if 提升性能”这个错误认知吧

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

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

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

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

© 2021 V2EX