Day 6:单二进制部署+压测——Go的性能有多猛
今天做什么
编译部署 + 压测。看看 Go 的分析引擎到底能扛多少并发。
编译
bash
# 编译成单一二进制
go build -ldflags="-s -w" -o doc-analyzer
# 文件大小
ls -lh doc-analyzer
# -rwxr-xr-x 12M doc-analyzer
# 放进 Docker(Dockerfile 只有3行)
cat > Dockerfile << 'EOF'
FROM scratch
COPY doc-analyzer /doc-analyzer
ENTRYPOINT ["/doc-analyzer"]
EOF
docker build -t doc-analyzer .
# 镜像大小:约 12MB压测
go
// 内置压测工具
func (s *AnalyzerServer) runBenchmark() {
ctx := context.Background()
doc := generateLargeDoc() // 1万字文档
// 串行基准
start := time.Now()
for i := 0; i < 10; i++ {
s.analyzer.chain.Analyze(ctx, doc)
}
serialTime := time.Since(start)
// 并发基准(50个并发)
start = time.Now()
g, ctx := errgroup.WithContext(ctx)
for i := 0; i < 50; i++ {
g.Go(func() error {
_, err := s.analyzer.chain.Analyze(ctx, doc)
return err
})
}
g.Wait()
parallelTime := time.Since(start)
fmt.Printf("串行 10份:%v(单份 %v)\n",
serialTime, serialTime/10)
fmt.Printf("并发 50份:%v\n", parallelTime)
fmt.Printf("加速比:%.1fx\n",
float64(serialTime)/float64(parallelTime)*5) // 50/10 = 5 倍工作量
}性能报告
bash
./doc-analyzer --benchmark
# 典型输出(MacBook Pro M1):
# 串行 10份:3.2s(单份 320ms)
# 并发 50份:1.8s
# 加速比:8.9x
# 内存峰值:86MB和 Python 版的对比
| 指标 | Python (FastAPI) | Go (net/http + gRPC) |
|---|---|---|
| 内存占用 | 280MB | 86MB |
| 镜像大小 | 350MB | 12MB |
| 50并发耗时 | 8.2s (asyncio) | 1.8s (goroutine) |
| 部署步骤 | venv + pip + uvicorn | 一个二进制 |
项目复盘
6 天,从文件解析到生产级 gRPC 服务:
| Day | 做了什么 | Go 亮点 |
|---|---|---|
| 1 | 文档解析 Pipeline | os.ReadFile + 分段切割 |
| 2 | Eino Chain 链式处理 | compose.NewChain + Lambda |
| 3 | goroutine 并发 50 份 | errgroup + 信号量限流 |
| 4 | MD5 缓存 | sync.Map 并发安全缓存 |
| 5 | gRPC 服务化 | protoc → 多语言客户端 |
| 6 | 编译部署 + 压测 | 12MB 镜像,8.9x 加速比 |
项目二完成。Go 做文档分析:更快、更小、更容易部署。

