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

相关推荐
2601_962218475 小时前
万象生鲜系统区块链溯源技术帮助生鲜企业搭建食品安全数字化体系
大数据·运维·微服务·云原生·架构
智购科技无人售货机厂家5 小时前
2026自动售货机制冷系统维护指南:从散热器清洁到压缩机换油的工程实践~YH
运维·redis·物联网·缓存·架构
YCOSA20256 小时前
雨晨 Windows 11 IoT 企业版 LTSC 26H2 轻装 26300.9278 自用版
windows·物联网
笨笨饿11 小时前
#135_代码中的类型重定义艺术:从基础封装到函数类型设计
开发语言·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
2601_9620652513 小时前
【图文详解】什么是微服务?什么是SpringCloud?
spring cloud·微服务·架构
令狐少侠201113 小时前
物联网mqtt
物联网
会周易的程序员14 小时前
企业私有 AI 算力服务器架构设计:异构四节点 + QUIC 微服务
运维·服务器·c++·人工智能·微服务·架构
2601_9622186114 小时前
万象生鲜系统全链路溯源一码查询技术实现食材来源可查
分布式·微服务·云原生·架构
深圳市爱派派智能科技有限公司15 小时前
从英伟达 GPU 到 RK3566 实机:Microduck 25 厘米强化学习机器人部署手记
机器人·边缘计算·强化学习·rk3566·机器人英伟达
2601_9622184716 小时前
万象生鲜系统跨仓调拨算法助力生鲜企业供应链数字化协同运营
大数据·运维·微服务·云原生·架构