零线刷新幂等去重 缓存数组逐元素比较
现象
零线对齐初始化那阵,发现磁盘被频繁读、初始化很慢。profile 了一下,看到 reloadBuffer 被反复触发了很多次。
原因
初始化时有好几个事件源(不同组件的状态变更)都会触发 reloadBuffer——也就是重新从磁盘读雷达数据再刷新。这些事件短时间里密集到达,虽然最后零线的状态其实没变,但每次都老老实实重读一遍磁盘,做了大量重复 IO。
去重
要让刷新幂等,说白了就是相同的输入只处理一次。把上一次的 zeroPositions 数组缓存下来,新事件来了先比一比新旧:
fun onZeroLineUpdate(newPositions: DoubleArray) { |
为什么不算哈希
第一反应可能是算个哈希比一下,快。但哈希会碰撞:两个内容不同的数组哈希恰好一样,就会被当成”没变”漏掉刷新,雷达图就错位了。在”漏一次刷新 = 画面出错”的场景里,这种概率性的比较不能用。
逐元素 contentEquals 是精确比,没有碰撞;开销比哈希稍多一点,但这种数组也就几百几千个元素,根本感觉不到,换来的是确定性。(数组真要到了百万级,可以再加个脏标记或版本号先粗筛一轮,这里用不上。)
所以事件去重说到底就是让处理幂等。比较新旧输入的时候,能精确比就别图省事用哈希——除非你能接受偶尔撞一下车。反正我的做法就是缓存上一次的输入、逐个比一遍,这种防重复触发的场景基本都够用了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CYK's Blog!
评论
