统计多数组列组合重复数的两种Ruby方案哪个性能更优,为什么?
性能对比结论
方案2性能更优,二者的性能差异主要来自内存开销和遍历逻辑的复杂度差异,具体分析如下:
共同开销部分
两个方案第一步都执行了a.zip(b, c),将三个数组合并为元素是三元组的新数组,这一步的时间、内存开销完全一致,差异在后续的重复统计逻辑。
方案1的额外开销
group_by操作会为每个唯一的三元组构建一个存储所有匹配元素的数组,假设某三元组重复N次,就要额外存储N个元素的数组,内存开销随数组总长度线性增长,构建这些数组也会产生额外CPU消耗- 额外执行了一次
select全哈希遍历,过滤出现次数≤1的分组,属于冗余遍历 - 总计需要执行3次全量/半全量遍历:
group_by遍历、select遍历、求和遍历
方案2的优势
- 直接统计每个三元组的出现次数,哈希的value仅存储整数计数,不需要存储全部分组元素,内存开销仅和唯一三元组的数量成正比,重复数据越多,内存优势越明显
- 不需要做冗余的分组数组构建、过滤操作,CPU指令数远低于方案1
- 总计只需要2次全量/半全量遍历:计数遍历、哈希求和遍历,遍历次数更少
可优化的简化版本
你还可以进一步优化方案2,把两次哈希遍历合并为一次,性能还能再提升:
zip = a.zip(b, c) count = Hash.new(0) sum = 0 zip.each do |e| count[e] += 1 sum += 1 if count[e] > 1 end return sum
内容的提问来源于stack exchange,提问作者Tarta
相关产品推荐
相关产品推荐

