ioutil.ReadAll and base64 Encoder benchmark
Streamの扱い方 by jun06t を読んだ。
ioutil.ReadAll は io.Reader や io.Writer を使ったときと比べてメモリ効率が良くなく、避けた方が良いみたい。
知らなかった。
資料を参考にしつつ、個人的に気になった base64 encoder のベンチマークを加えて、自分でも試してみた。
結果
[utahta@mbp13 bench]% go version go version go1.8.3 darwin/amd64 # /tmp/image.jpg 300KB [utahta@mbp13 bench]% go test -bench . -benchmem BenchmarkRead1-4 10000 121861 ns/op 1046577 B/op 11 allocs/op BenchmarkRead2-4 50000 37957 ns/op 311456 B/op 3 allocs/op BenchmarkEncode1-4 3000 459245 ns/op 1130656 B/op 5 allocs/op BenchmarkEncode2-4 3000 516458 ns/op 1455392 B/op 13 allocs/op PASS # /tmp/image.jpg 20MB [utahta@mbp13 bench]% go test -bench . -benchmem BenchmarkRead1-4 200 8519747 ns/op 67106875 B/op 17 allocs/op BenchmarkRead2-4 500 3436382 ns/op 20480160 B/op 3 allocs/op BenchmarkEncode1-4 50 32229327 ns/op 75104416 B/op 5 allocs/op BenchmarkEncode2-4 50 34383885 ns/op 94418246 B/op 19 allocs/op PASS
read は、たしかに ioutil.ReadAll を使う理由がないくらい差がある模様。
もしくは ioutil.ReadAll の中身を io.Copy を使うように書きかえたら、みんな幸せになるのでは…?
反面 base64 Encoder は、EncodeToString の方が結果が良かった。
僕の書き方が悪い可能性も大いにあるけど、少なくともこのように書いて得することはなさそう。