• 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

  • 相关阅读:
    【springboot+vue】原生小程序电子班牌系统 智慧校园云平台源码
    【MySQL系列】MySQL的事务管理的学习(二)_ 再次理解隔离性
    【Java 面试题】MySQL与Redis 如何保证双写一致性
    相机匹配点的选取(基于竖直直杆)
    【FPGA教程案例87】加解密1——基于FPGA的AES加解密算法verilog实现
    WSL1 安装 debian xfce 用xrdp 导入远程桌面
    初识结构体
    Maven-依赖管理机制
    redis-benchmark工具学习笔记
    28_content 阶段的 index 模块
  • 原文地址:https://www.cnblogs.com/guyouyin123/p/16565645.html