読者です 読者をやめる 読者になる 読者になる

あ、手元でdeferがどれくらい遅いか確かめたことない

Golang パフォーマンスチューニング - Qiita

を読んで唐突にそう思い立ったので

コード

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

小並感

うーんこの