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

相关推荐
Zarek枫煜7 小时前
[特殊字符] C3语言:传承C之高效,突破C之局限
c语言·开发语言·c++·单片机·嵌入式硬件·物联网·算法
雪兽软件9 小时前
业务流程管理 (BPM) 在物联网 (IoT) 中的作用
物联网·bpm·业务流程管理
迷藏4949 小时前
**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**在物联网(IoT)飞速发展的今天,传统云
java·开发语言·python·物联网
这张生成的图像能检测吗9 小时前
(论文速读)基于混合学习的边缘计算物联网系统操作视觉质量检测
人工智能·深度学习·物联网·智能制造·异常检测
renhongxia110 小时前
大模型Prompt实战:精准生成专业技术文档
人工智能·微服务·语言模型·自然语言处理·机器人·prompt
TDengine (老段)11 小时前
TDengine IDMP 工业数据建模 —— 元素与数据查询
大数据·数据库·人工智能·物联网·时序数据库·tdengine·涛思数据
zhaoshuzhaoshu11 小时前
LE Audio(低功耗音频)协议架构术语全详细解析
物联网·蓝牙·无线
电子科技圈13 小时前
芯科科技驱动和重塑智能门锁行业格局多协议、安全性、AI技术与开发工具共同赋能
大数据·人工智能·嵌入式硬件·mcu·物联网·智能家居·iot
s1mple“”13 小时前
大厂Java面试实录:从Spring Boot到AI技术的医疗健康场景深度解析
spring boot·redis·微服务·kafka·向量数据库·java面试·ai技术