• benchmark性能测试


    benchmark介绍

       基准测试主要是通过测试CPU和内存的效率问题,来评估被测试代码的性能,进而找到更好的解决方案。
    
       而Go语言中自带的benchmark则是一件非常神奇的测试利器。有了它,开发者可以方便快捷地在测试一个函数方法在串行或并行环境下的基准表现。指定一个时间(默认是1秒),看测试对象在达到或超过时间上限时,最多能被执行多少次和在此期间测试对象内存分配情况。
    
    1.基准测试代码文件必须是_test.go结尾,和单元测试一样;
    2.基准测试的函数以Benchmark开头;
    3.参数须为 *testing.B;
    4.基准测试函数不能有返回值;
    5.b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰;
    6.b.StopTimer()停止计时器
    7.b.N是基准测试框架提供的,Go会根据系统情况生成,不用用户设定,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能;
    

    benchmark运行

    go test -bench=. -benchmem
    
    
    输出解释:
    函数名后面的-8,表示运行时对应的 GOMAXPROCS 的值;
    1:代表循环次数
    9581522041:代表执行花费时间 (越少越好)
    5559464 B/op :代表分配了多少字节内存(越少越好)
    20522 allocs/op:代表发生了多少次不同的内存分配(越少越好)
    

    benchmark运行参数

    -benchtime=3s :指定运行时间
    -benchmem:显示分配内存大小,分配内存次数
    -cpu=4:指定cpu数量
    -count=2:指定运行次数
    

    benchmark性能测试案例

    测试目标:

    func demo1() {
       count := 0
       mux := sync.Mutex{}
       wg := sync.WaitGroup{}
       for i := 0; i < 10000; i++ {
          wg.Add(1)
          go func() {
             defer wg.Done()
             for j := 0; j < 10000; j++ {
                mux.Lock()
                count++
                mux.Unlock()
             }
          }()
       }
       wg.Wait()
    }
    
    func demo2() {
       wg := sync.WaitGroup{}
       var count int32 = 0
       for i := 0; i < 10000; i++ {
          wg.Add(1)
          go func() {
             defer wg.Done()
             for j := 0; j < 10000; j++ {
                atomic.AddInt32(&count, 1)
             }
          }()
       }
       wg.Wait()
    }
    

    main_test.go

    import (
    	"testing"
    )
    
    func BenchmarkDemo1(b *testing.B) {
    	b.ResetTimer()
    	demo1()
    	b.StopTimer()
    }
    
    func BenchmarkDemo2(b *testing.B) {
    	b.ResetTimer()
    	demo2()
    	b.StopTimer()
    }
    

    启动命令:go test -bench=. -benchmem

  • 相关阅读:
    Linux开发工具
    Grafana系列-Loki-基于日志实现告警
    spring boot 使用AOP实现是否已登录检测
    夯实思想根基:建行江门市分行持续加强党建工作
    黄仁勋的元宇宙梦想:虚拟世界将如同互联网站那样不断涌现
    Maven仓库:repository
    【华为OD机试python】评论转换输出【2023 B卷|100分】
    springboot验证码的生成与验证
    java 每种设计模式的作用,与应用场景
    利用稳定扩散快速修复图像
  • 原文地址:https://www.cnblogs.com/guyouyin123/p/16565645.html