はじめに
めんどくさいですよね。Goパッケージ化しました。
面接試験などでFizzBuzz課題が出た時などに使ってみてください。
リポジトリ
使い方はREADME参照ください
同期/非同期モード
常々、FizzBuzzって非同期にしたらええんじゃないの?と思ってたので非同期のメソッドも作りました。
こんな感じで呼び出します。
fizzbuzz.DoAsync(100, 10)
処理はこちらです。
https://github.com/junpayment/fizzbuzz/blob/master/fizzbuzz.go#L38
数字をFizzBuzz化して、結果を別goroutineに渡してソートしているんですね。
ベンチマークはこちらです。
goos: darwin
goarch: amd64
pkg: fizzbuzz
BenchmarkDo/num_10000/do_sync-8 2000 707744 ns/op
BenchmarkDo/num_10000/do_async/goroutine_1-8 200 8040204 ns/op
BenchmarkDo/num_10000/do_async/goroutine_5-8 200 6065541 ns/op
BenchmarkDo/num_10000/do_async/goroutine_10-8 200 5985554 ns/op
BenchmarkDo/num_10000/do_async/goroutine_20-8 300 5787948 ns/op
BenchmarkDo/num_10000/do_async/goroutine_100-8 300 5782902 ns/op
BenchmarkDo/num_10000/do_async/goroutine_1000-8 200 6126495 ns/op
はい、非同期の方がスコア悪いですね。
FizzBuzzの処理は入力待ちとか応答待ちとか皆無なので、並列化した際のチャネルスイッチのコストの方がぜんぜん高いということだと思います。
おそらく、こちらの関数にtime.Sleep(10 * time.Millisecond)
など入れるとスコアが逆転すると思います。
以上