17-第17章-性能测试与基准测试

第17章:性能测试与基准测试

17.1 Go 测试框架

17.1.1 基础测试

go 复制代码
package database

import "testing"

func TestInit(t *testing.T) {
    err := Init("./testdb", false, "", "")
    if err != nil {
        t.Fatalf("Failed to init database: %v", err)
    }
}

func TestQueryRecords(t *testing.T) {
    records, err := QueryRecords(Table, "TestDevice", "", "")
    if err != nil {
        t.Fatalf("Failed to query records: %v", err)
    }
    t.Logf("Got %d records", len(records))
}

17.1.2 子测试

go 复制代码
func TestBatchInsert(t *testing.T) {
    tests := []struct {
        name      string
        batchSize int
    }{
        {"small", 10},
        {"medium", 100},
        {"large", 1000},
    }
    
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            records := generateTestRecords(tt.batchSize)
            err := BatchInsertWithRetry(Table, records, 3, time.Second)
            if err != nil {
                t.Fatalf("Batch insert failed: %v", err)
            }
        })
    }
}

17.2 基准测试

17.2.1 基准测试基础

go 复制代码
func BenchmarkQueryRecords(b *testing.B) {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        _, _ = QueryRecords(Table, "TestDevice", "", "")
    }
}

func BenchmarkBatchInsert(b *testing.B) {
    records := generateTestRecords(100)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        _ = BatchInsertWithRetry(Table, records, 3, time.Second)
    }
}

17.2.2 运行基准测试

bash 复制代码
# 运行基准测试
go test -bench=. -benchmem

# 运行特定基准测试
go test -bench=BenchmarkQueryRecords -benchmem

# 运行更长时间
go test -bench=. -benchtime=10s -benchmem

17.2.3 基准测试输出解读

复制代码
BenchmarkQueryRecords-8         10000   123456 ns/op   4567 B/op   12 allocs/op
  • BenchmarkQueryRecords-8:测试名称和 GOMAXPROCS
  • 10000:运行次数
  • 123456 ns/op:每次操作纳秒数
  • 4567 B/op:每次操作分配字节数
  • 12 allocs/op:每次操作分配次数

17.3 性能分析工具

17.3.1 pprof

go 复制代码
import _ "net/http/pprof"

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil))
    }()
    
    // 主程序逻辑
}
bash 复制代码
# 收集 CPU profile
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

# 收集内存 profile
go tool pprof http://localhost:6060/debug/pprof/heap

# 收集 goroutine profile
go tool pprof http://localhost:6060/debug/pprof/goroutine

17.3.2 pprof 交互命令

复制代码
top10          # 显示前10个函数
list function  # 显示函数代码
web            # 生成调用图(需要 graphviz)
png            # 生成 PNG 图片

17.3.3 trace 工具

go 复制代码
import "runtime/trace"

func main() {
    f, err := os.Create("trace.out")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    
    trace.Start(f)
    defer trace.Stop()
    
    // 主程序逻辑
}
bash 复制代码
# 运行并生成 trace
go test -trace=trace.out

# 查看 trace
go tool trace trace.out

17.4 负载测试

17.4.1 编写负载测试

go 复制代码
package main

import (
    "net/http"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    client := &http.Client{
        Timeout: 10 * time.Second,
    }
    
    requestCount := 1000
    concurrency := 10
    
    semaphore := make(chan struct{}, concurrency)
    startTime := time.Now()
    
    for i := 0; i < requestCount; i++ {
        wg.Add(1)
        semaphore <- struct{}{}
        
        go func() {
            defer wg.Done()
            defer func() { <-semaphore }()
            
            resp, err := client.Get("http://localhost:8081/api/readings?deviceName=TestDevice")
            if err != nil {
                log.Printf("Request failed: %v", err)
                return
            }
            defer resp.Body.Close()
        }()
    }
    
    wg.Wait()
    duration := time.Since(startTime)
    
    log.Printf("Requests: %d", requestCount)
    log.Printf("Duration: %v", duration)
    log.Printf("RPS: %.2f", float64(requestCount)/duration.Seconds())
}

17.5 实战练习

练习 17.1:基准测试

为数据库模块编写完整的基准测试。

练习 17.2:性能分析

使用 pprof 分析系统瓶颈并优化。

练习 17.3:负载测试

设计并运行负载测试,找出系统最大吞吐量。

17.6 本章小结

本章讲解了性能测试和基准测试:

  • Go 测试框架使用
  • 基准测试编写和运行
  • pprof 性能分析
  • trace 工具使用
  • 负载测试设计

持续的性能测试是保持系统高性能的关键。


本书版本 :1.0.0
最后更新 :2026-03-08
sfsEdgeStore - 让边缘数据存储更简单!🚀
技术栈 - Go语言、sfsDb与EdgeX Foundry。纯golang工业物联网边缘计算技术栈
项目地址 :GitHub
GitCode 镜像 :GitCode

相关推荐
HZZD_HZZD11 小时前
大口径摄像水表白皮书拆解:DN40加装改造与字轮识别实测
运维·物联网·腾讯云
SL_staff12 小时前
设备离线时业务不中断:JVS-IOT高可用架构解析
java·物联网·产品
byte轻骑兵17 小时前
【LMP】规范精讲[11]: 暗房里的协议——产线射频测试是怎么指挥芯片的
物联网·通信协议·蓝牙协议·lmp·蓝牙链路管理
芯片人00718 小时前
GEK100系列芯片进入上市公司上海移远通信供应链
人工智能·单片机·嵌入式硬件·物联网·芯片
热文新讯1 天前
迎进博·话疗愈:2026酒店“疗愈睡眠”闭门研讨会在沪举行
大数据·人工智能·物联网
数字新视界1 天前
机房动环监控系统助力数据中心高效能管理与安全保障
物联网·数据可视化·数据中心基础设施管理·dcim管理系统·数据中心dcim
数字新视界2 天前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
注塑机数据采集联网2 天前
数据采集网关入门:ZK-D1/D3从零开始构建你的数据运用
大数据·数据仓库·人工智能·物联网·数据库架构·注塑机网关
微三云 - 廖会灵 (私域系统开发)2 天前
企业级 SaaS 系统架构设计:单体、微服务还是模块化单体?技术选型实战
微服务·架构·系统架构
智购科技智能售货柜2 天前
顾客已经关门,视觉售货柜还在处理旧画面:延迟积压怎么查?~YH
python·单片机·嵌入式硬件·物联网·eclipse