零线刷新幂等去重 缓存数组逐元素比较
现象
零线对齐初始化阶段,发现磁盘被频繁读取、初始化很慢。profile 后看到 reloadBuffer 被重复触发了很多次。
原因
初始化时有多个事件源(不同组件的状态变更)都会触发 reloadBuffer(重新从磁盘读雷达数据并刷新)。这些事件在短时间内密集到达,虽然最终零线状态没变,但每次都老老实实重新读一遍磁盘,做了大量重复 IO。
去重:缓存 + 逐元素比较
要让刷新幂等——相同输入只处理一次。缓存上一次的 zeroPositions 数组,新事件来时先比较新旧:
fun onZeroLineUpdate(newPositions: DoubleArray) { |
为什么不用哈希
第一反应可能是算个哈希比较,快。但哈希有碰撞风险:两个内容不同的数组哈希撞了,就会被误判为“没变”而漏掉刷新,雷达图就错位了。对于“漏刷新会导致显示错误”的场景,哈希这种概率性比较不可接受。
逐元素 contentEquals 是精确比较,没有碰撞,虽然比哈希慢一点(数组也就几百几千个元素,开销可忽略),但换来了正确性。
小结
事件去重的关键是让处理幂等。比较方式上,能精确比较就别用哈希——除非你能接受碰撞带来的偶发错误。缓存上一次输入、逐元素精确比对,是这类“防重复触发”场景的稳妥做法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CYK's Blog!
评论
