You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang函数CrossPointTwoRects多次调用耗时过高原因排查求助

函数CrossPointTwoRects多次调用性能劣化原因分析

核心性能瓶颈点:

  • 字符串格式化与字符串型map key的高开销:
    每次循环都通过fmt.Sprintf("%d-%d", x, y)生成字符串key,这个操作涉及内存分配、字符转换等计算;同时用string作为map的key,哈希计算和键值比较的成本远高于数值类型,高频调用下,map的查找、插入操作会成为显著性能瓶颈。

  • 无效循环与冗余判断:
    代码遍历两个矩形的所有x、y组合(共16次循环),但两个矩形的交点最多只有4个,绝大多数循环都是无效的。每次循环还要执行多组边界判断,单次调用的开销虽小,但高频调用下累加的耗时会被放大。

  • 频繁小内存分配引发GC压力:
    每次调用append(crossPoints, []int{x, y})都会分配新的小切片对象,多次调用后会产生大量小内存块,触发Go的垃圾回收(GC)频繁运行。GC的停顿时间会被计入函数执行耗时,这也是单次调用耗时飙升至0.5ms的关键原因之一。

针对性优化建议:

  • 用数值类型替代字符串作为map key:
    将x和y打包为一个int64值(例如int64(x)<<32 | int64(y)&0xFFFFFFFF),直接作为map的key,彻底避免字符串格式化的开销。

  • 直接计算交集顶点,消除无效循环:
    先计算两个矩形的交集区域:

    crossX1 := max(x1, x3)
    crossY1 := max(y1, y3)
    crossX2 := min(x2, x4)
    crossY2 := min(y2, y4)
    

    若crossX1 > crossX2 || crossY1 > crossY2则无交集;否则直接枚举交集的四个顶点[crossX1,crossY1]、[crossX1,crossY2]、[crossX2,crossY1]、[crossX2,crossY2],无需遍历所有组合,循环次数直接降至4次以内。

  • 预分配内存+移除map去重:
    由于交点最多4个,初始化时直接make([][]int, 0, 4),减少append时的内存重分配;同时直接计算顶点不会产生重复点,完全可以去掉existed map,进一步降低开销。

内容的提问来源于stack exchange,提问作者zhuohuashiyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:57:54