cyningsun / blog-sidecar

blog sidecar
0 stars 0 forks source link

译 | Profiling Go Programs #61

Open cyningsun opened 4 years ago

cyningsun commented 4 years ago

https://cyningsun.github.io/07-20-2019/profiling-go-programs-cn.html

博学、慎思、明辨、笃行

DavidYanXW commented 3 years ago

请教个问题,为啥内存profile是执行一次就退出?cpu profile可以整个执行完再退出?

cyningsun commented 3 years ago

@DavidYanXW 请教个问题,为啥内存profile是执行一次就退出?cpu profile可以整个执行完再退出?

跟机制相关,内存 profile 是镜像某个点的内存情况;CPU profile 是要以一定的频率采样 CPU 正在执行的内容,需要持续一段时间。

DavidYanXW commented 3 years ago

@cyningsun

@DavidYanXW 请教个问题,为啥内存profile是执行一次就退出?cpu profile可以整个执行完再退出?

跟机制相关,内存 profile 是镜像某个点的内存情况;CPU profile 是要以一定的频率采样 CPU 正在执行的内容,需要持续一段时间。

内存profile可以是某个时刻的内存情况,那能是整个程序执行完的时候吗? 我看文章的意思好像是只能循环一次?

cyningsun commented 3 years ago

@DavidYanXW

@cyningsun

@DavidYanXW 请教个问题,为啥内存profile是执行一次就退出?cpu profile可以整个执行完再退出?

跟机制相关,内存 profile 是镜像某个点的内存情况;CPU profile 是要以一定的频率采样 CPU 正在执行的内容,需要持续一段时间。

内存profile可以是某个时刻的内存情况,那能是整个程序执行完的时候吗? 我看文章的意思好像是只能循环一次?

执行完的时候? 没有特别的理解,你能介绍下使用场景么?

DavidYanXW commented 3 years ago

@cyningsun

@DavidYanXW

@cyningsun

@DavidYanXW 请教个问题,为啥内存profile是执行一次就退出?cpu profile可以整个执行完再退出?

跟机制相关,内存 profile 是镜像某个点的内存情况;CPU profile 是要以一定的频率采样 CPU 正在执行的内容,需要持续一段时间。

内存profile可以是某个时刻的内存情况,那能是整个程序执行完的时候吗? 我看文章的意思好像是只能循环一次?

执行完的时候? 没有特别的理解,你能介绍下使用场景么?

havlak3.go

FindHavlakLoops(cfgraph, lsgraph)
if *memprofile != "" {
    f, err := os.Create(*memprofile)
    if err != nil {
        log.Fatal(err)
    }
    pprof.WriteHeapProfile(f)
    f.Close()
    return
}

for i := 0; i < 50; i++ {
    FindHavlakLoops(cfgraph, NewLSG())
}

pprof.WriteHeapProfile(f)能放在for i := 0; i < 50; i++ {}循环后面吗? 或者更简单一些,放在defer里面,等待整个main()函数执行完的时候处理?

cyningsun commented 3 years ago

@DavidYanXW

@cyningsun

@DavidYanXW

@cyningsun

@DavidYanXW 请教个问题,为啥内存profile是执行一次就退出?cpu profile可以整个执行完再退出?

跟机制相关,内存 profile 是镜像某个点的内存情况;CPU profile 是要以一定的频率采样 CPU 正在执行的内容,需要持续一段时间。

内存profile可以是某个时刻的内存情况,那能是整个程序执行完的时候吗? 我看文章的意思好像是只能循环一次?

执行完的时候? 没有特别的理解,你能介绍下使用场景么?

havlak3.go

FindHavlakLoops(cfgraph, lsgraph) if memprofile != "" { f, err := os.Create(memprofile) if err != nil { log.Fatal(err) } pprof.WriteHeapProfile(f) f.Close() return }

for i := 0; i < 50; i++ { FindHavlakLoops(cfgraph, NewLSG()) }

pprof.WriteHeapProfile(f)能放在for i := 0; i < 50; i++ {}循环后面吗? 或者更简单一些,放在defer里面,等待整个main()函数执行完的时候处理?

可以的。但是 Profile 出来的内容是不同的,因为 for loop 里使用了 cfgraph 的变量