使用Go标准库testing包编写基准测试函数,通过go test命令量化函数执行效率。基准测试函数命名需以Benchmark开头,使用b.N控制循环次数(由go test自动调整)。
示例代码:
package main
import "testing"
func BenchmarkAddition(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = 1 + 1 // 待测试代码
}
}
运行命令:go test -bench=. -benchmem(-benchmem显示内存分配情况),输出结果包含每次操作的纳秒数(ns/op)和内存分配次数(allocs/op)。
Go内置pprof工具,支持CPU、内存、goroutine等维度的深度分析。
net/http/pprof并启动HTTP服务,通过go tool pprof生成火焰图:import _ "net/http/pprof"
func main() {
go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }()
// 业务代码
}
命令:go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30(采集30秒CPU数据)。-memprofile参数生成内存快照,分析内存分配情况:go test -memprofile mem.out ./...;分析命令:go tool pprof mem.out。/debug/pprof/goroutine端点获取goroutine堆栈,排查goroutine泄漏。使用wrk或go-wrk工具模拟高并发HTTP请求,测试Web服务性能。
wrk -t12 -c400 -d30s http://localhost:8080(12线程、400并发、30秒持续时间),输出请求速率(Requests/sec)、延迟分布(Latency)等信息。go-wrk -c=400 -t=8 -n=100000 http://localhost:8080/index.html。-ldflags="-s -w"去除调试信息和符号表,降低启动时间和内存占用:go build -ldflags="-s -w" -o myapp。-gcflags="-m"查看编译器内联决策,合理修改代码(如简化函数逻辑)以促进内联,提升执行效率。export GOMAXPROCS=4 或 runtime.GOMAXPROCS(4),充分利用多核资源。GOGC环境变量(默认100%,即堆内存增长100%时触发GC),降低至50%可减少GC次数,但会增加内存占用;GOMEMLIMIT设置进程内存上限,避免GC过度消耗CPU。bytes.Buffer.Reset()清空缓冲区),避免循环内创建临时对象。var pool = sync.Pool{New: func() interface{} { return new(bytes.Buffer) }}
buf := pool.Get().(*bytes.Buffer)
defer pool.Put(buf)
```。
map代替切片做快速查找),避免不必要的内存消耗。sync.Mutex保护共享资源时,尽量缩小临界区范围;优先使用无锁数据结构(如atomic包)。bufio包包装文件或网络句柄,减少系统调用次数:reader := bufio.NewReader(file),writer := bufio.NewWriter(file)。sql.DB.SetMaxOpenConns(10)),减少连接建立和关闭的开销。/etc/security/limits.conf(如* soft nofile 65535)或使用ulimit -n 65535,支持更多并发连接。/etc/sysctl.conf中的参数(如net.core.somaxconn=65535、net.ipv4.tcp_tw_reuse=1),提升网络吞吐量和连接复用率。benchstat工具对比结果(如benchstat old.txt new.txt),确保优化有效。