• Geek_b9db3a
    2024-12-16 来自天津
    curl "http://127.0.0.1:8888/debug/pprof/heap?seconds=30" > heap.pprof go tool pprof -http :8889 heap.pprof heap.pprof: parsing profile: unrecognized profile format failed to fetch any source profiles

    作者回复: 报错是解析文件失败了,一般是生成的文件有问题。可以看下curl "http://127.0.0.1:8888/debug/pprof/heap?seconds=30" > heap.pprof生成的过程有没有报什么错,比如Failed to connect之类的,导致文件内容存储的不是火焰图,而是报错的文本内容

    
    
  • lJ
    2024-12-14 来自江苏
    对于slice,如果无法预估所有数据大小,可以通过每次扩展时成倍增加容量,减少频繁扩容带来的开销。 在高并发场景下,如果需要对 map 进行频繁的多次读一次写操作,推荐使用 sync.Map。如果是多次读写情况,推荐使用concurrent-map。 map 的性能高度依赖于键的哈希分布,尽量选择能避免哈希冲突的键。 对于任何容器类型,如果需要频繁创建和销毁对象,都会导致 GC 压力增加,可以使用 sync.Pool 实现对象的重用。

    作者回复: 👍👍👍,其实slice append内部,就是用倍数扩容的机制实现的。sync.Map的使用条件比较苛刻,在后面有一节专门会讲

    
    
  • 快叫我小白
    2024-12-15 来自上海
    我不确定我的理解是否正确,benchmark上内存消耗情况指的是从程序运行到结束分配过的内存总字节数,而不是程序运行过程中某一时刻的最大使用内存字节数。所以我们在做内存性能优化时追求的、并且衡量一个程序内存使用效率的好坏的指标都是前者?跟我一直的理解有点出入,我以为释放掉的内存会被垃圾回收,所以只要确保内存使用峰值不要过高就好了,😂如果我的理解有误希望老师能指正一下~
    
    
  • 陈卧虫
    2024-12-15 来自浙江
    听完老师的课查了一下资料,总结一下,不足之处请老师指正,容器类型优化的其它技巧: 1. 尽量避免频繁对 map 和 slice 的增删,这会触发底层结构重新分配 2. 并发场景下 减少锁争用,比如使用并发安全的 sync.map 或者 通过分片技术将大 map 分为小 map 3. 需要大量短生命周期容器对象时,通过 sync.pool 复用对象,减少频繁的内存重新分配 4. 在多线程场景下,使用 sync.once 优化初始化操作,保证只执行一次 5. 容器元素为 大对象 或者 复杂结构体,传递指针而不是值,这样可以减少拷贝的开销,特别是在作为函数参数时 6. 对于结构体来说,按照字段的大小降序排列,可以降低内存对齐时的填充浪费
    
    