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

相关推荐
仙草不加料5 小时前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区
程序员老邢5 小时前
【技术底稿 19】Redis7 集群密码配置 + 权限锁死 + 磁盘占满连锁故障真实排查全记录
java·服务器·经验分享·redis·程序人生·微服务
fanly116 小时前
利用surging 网络组件重构插件开发
微服务·ai·microservice
jonyleek9 小时前
【JVS更新日志】物联网、AI套件、在线白板插件4.22更新说明!
物联网·更新·规则引擎·jvs·智能排产·白板插件·ai套件
三佛科技-1341638421210 小时前
PL3325CS/CD/CH/CE 与PL3325BE 之间的对比与联系(应用功率与典型应用电路)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
blevoice10 小时前
杰理智能蓝牙音响开发板AC696N:文件系统操作API精讲
单片机·物联网·杰理蓝牙芯片·ac6966b蓝牙音响方案·杰理智能音箱开发·杰理ac6965e蓝牙音频开发
三佛科技-1341638421211 小时前
FT838NB1-RT_5W(5V1A)原边反馈(5级能效)典型应用电路分析
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
钒星物联网12 小时前
一文说清如何选对卫星物联网数传终端
物联网·数据传输·卫星通信·低轨·野外监测·低轨卫星物联网终端
广州灵眸科技有限公司14 小时前
瑞芯微(EASY EAI)RV1126B rknn-toolkit-lite2使用方法
linux·网络·人工智能·物联网·算法
2603_9547083114 小时前
多能互补微电网:六大发展趋势,助力新型电力系统多能协同升级
人工智能·物联网·架构·系统架构·能源