2.实时推荐系统性能优化-系统性能瓶颈分析

很多人拿到系统的第一步,估计就是直接看代码,找瓶颈点了。其实这样的效率并不高。很多系统结构复杂,直接修改代码很有可能结果时改了一片代码,最后进行性能测试发现几乎没用提升。这里我们使用jProfiler进行代码性能分析。

(1)性能排查

jProfiler的安装和使用这里不会介绍,网上有很多资料。这里主要介绍问题排查过程。通过jProfiler启动项目后,我们对需要测试的接口方法进行调用,生成调用链后查看系统性能。

调用链
耗时严重

其中,我们可以看出,接口1次调用后,map.put方法执行2583次,equals方法调用53388次。而且是测试环境数据,生产环境中数据量级远大于此。

(2)原理分析

由此可以看出,实时分析接口调用过程中,大量依赖map组装来实现匹配逻辑。虽然equals方法执行速度很快,但是由于map中对象数据量级过大。导致性能降低。其中map.put和map.putAll中都有使用equals方法。那么大量的equals调用到底来自那里呢?

HashMap.put

在map.put中,会遍历key对应hash表下的链表。当key的hash碰撞冲突时,会导致链表长度增长,性能下降。通过对key值得hashCode方法分析,key值得hashCode复写为数据库主键,所以几乎不可能产生hash碰撞。

HashMap.putAll

由此得出equals方法调用大多来自于putAll方法中,丢入大量数据导致。putAll方法中通过对每一个元素循环调用put方法。所以在实时匹配中,避免对map对象进行大量数据得putAll操作是本次优化得重点之一。

发表评论

电子邮件地址不会被公开。 必填项已用*标注