// executor_bench_test.go - 证明 DefaultExecutor 的零开销承诺. // // 对比 DefaultExecutor.Command + Start + Wait 和裸 exec.CommandContext + // Start + Wait 的每调用开销. 目标: 差值 < 5%. 超过触发设计回头 // (可能 Spec struct 值拷贝成本过大, 或 cmdProcess 方法转发有隐藏开销). // // 两组 baseline 设计意图: // // 1. /bin/true: zero-work 退出, 框架开销占比最大, 放大任何差异. // 如果这组 < 5%, 其他真实用例必然也 < 5%. // // 2. /bin/echo: 有 stdout 输出, 贴近真实 caller. 验证 Spec 字段映射 // 没有非线性开销. // // 便捷方法 Output / CombinedOutput 不单独测: 它们是 Start + 读 pipe + // Wait 的组合, 开销由被测的核心路径决定, 独立 bench 是噪音. // // 运行方式: // // cd core && go test ./pkg/execenv/ -bench=. -benchmem -run=^$ // // Linux/Mac only (fork/exec + /bin/true 依赖 POSIX), 和 Flyto core // 当前的 OS 支持面一致. Windows 支持是 TBD. package execenv import ( "context" "os/exec" "testing" ) func BenchmarkExecTrue_Native(b *testing.B) { ctx := context.Background() b.ReportAllocs() for b.Loop() { cmd := exec.CommandContext(ctx, "/bin/true") if err := cmd.Start(); err != nil { b.Fatal(err) } if err := cmd.Wait(); err != nil { b.Fatal(err) } } } func BenchmarkExecTrue_Default(b *testing.B) { ctx := context.Background() runner := DefaultExecutor{} spec := Spec{ Class: ClassBash, Path: "/bin/true", } b.ReportAllocs() for b.Loop() { p := runner.Command(ctx, spec) if err := p.Start(); err != nil { b.Fatal(err) } if err := p.Wait(); err != nil { b.Fatal(err) } } } func BenchmarkExecEcho_Native(b *testing.B) { ctx := context.Background() b.ReportAllocs() for b.Loop() { cmd := exec.CommandContext(ctx, "/bin/echo", "hello") if err := cmd.Start(); err != nil { b.Fatal(err) } if err := cmd.Wait(); err != nil { b.Fatal(err) } } } func BenchmarkExecEcho_Default(b *testing.B) { ctx := context.Background() runner := DefaultExecutor{} spec := Spec{ Class: ClassBash, Path: "/bin/echo", Args: []string{"hello"}, } b.ReportAllocs() for b.Loop() { p := runner.Command(ctx, spec) if err := p.Start(); err != nil { b.Fatal(err) } if err := p.Wait(); err != nil { b.Fatal(err) } } }