miller
发布于

go 工具链 (未完待续)

1. package

  • go mod init maocaoying.com/learn
  • go mod tidy
  • go install // install cmd into GOPTAH
  • go get // 感觉废弃了,直接go mod tidy

2. go help cmd

// help cmd detail info


3. test

  • go test [-v] learn_test.go // 指定文件 默认所有testfunc

  • go test -v -run TestA select_test.go // TestA func. TestA* 正则匹配的都会执行

  • go test -v -bench=. benchmark_test.go

  • go test -v -bench=. -benchtime=5s benchmark_test.go

  • go test -v -bench=Alloc -benchmem benchmark_test.go 内存分配

  • go test -bench=. -run=none 命令得到以下结果

    因为默认情况下 go test 会运行单元测试,为了防止单元测试的输出影响我们查看基准测试的结果,可以使用-run=匹配一个从来没有的单元测试方法,过滤掉单元测试的输出,我们这里使用none,因为我们基本上不会创建这个名字的单元测试方法。

  • -8 表示运行时对应的 GOMAXPROCS 的值;

  • 7618 for range times =>b.N

  • 146356 ns/op 每次操作花费 146356ns

并行用法

func BenchmarkSprints(b *testing.B) {
   b.RunParallel(func(pb *testing.PB) {
     for pb.Next() {
       // do something
       fmt.Sprint("代码轶事")
     }
   })
 }
  • RunParallel并发的执行benchmark。RunParallel创建p个goroutine然后把b.N个迭代测试分布到这些goroutine上。
  • goroutine的数目默认是GOMAXPROCS。如果要增加non-CPU-bound的benchmark的并个数,在执行RunParallel之前那就使用b.SetParallelism(p int)来设置,最终goroutine个数就等于p * runtime.GOMAXPROCS(0)。

bench 参考 https://zhuanlan.zhihu.com/p/426081521

  // 重置计时器   在for循环之前用
  b.ResetTimer()
  // 停止计时器
  b.StopTimer()
  // 开始计时器
  b.StartTimer()

4. 调试 优化

 $ go test -race mypkg
$ go run -race mysrc.go
$ go build -race mycmd
$ go install -race mypkg
浏览 (1272)
点赞
收藏
评论