あ、手元でdeferがどれくらい遅いか確かめたことない
を読んで唐突にそう思い立ったので
コード
package bench_test import ( "sync" "testing" ) func BenchmarkGoroutine(b *testing.B) { n := 10 var wg sync.WaitGroup b.ResetTimer() for i := 0; i < b.N; i++ { wg.Add(n) for j := 0; j < n; j++ { go func() { wg.Done() }() } wg.Wait() } } func BenchmarkGoroutineDefer(b *testing.B) { n := 10 var wg sync.WaitGroup b.ResetTimer() for i := 0; i < b.N; i++ { wg.Add(n) for j := 0; j < n; j++ { go func() { defer wg.Done() }() } wg.Wait() } } func BenchmarkSequential(b *testing.B) { n := 10 var wg sync.WaitGroup b.ResetTimer() for i := 0; i < b.N; i++ { wg.Add(n) for j := 0; j < n; j++ { func() { wg.Done() }() } wg.Wait() } } func BenchmarkSequentialDefer(b *testing.B) { n := 10 var wg sync.WaitGroup b.ResetTimer() for i := 0; i < b.N; i++ { wg.Add(n) for j := 0; j < n; j++ { func() { defer wg.Done() }() } wg.Wait() } }
sync.WaitGroupあるあるなdeferのベンチ生やしただけ
結果
PASS BenchmarkGoroutine 300000 5064 ns/op 164 B/op 11 allocs/op BenchmarkGoroutineDefer 200000 7225 ns/op 164 B/op 11 allocs/op BenchmarkSequential 5000000 298 ns/op 0 B/op 0 allocs/op BenchmarkSequentialDefer 1000000 1313 ns/op 0 B/op 0 allocs/op ok _/home/akira/Dropbox/go/test 6.189s