wantedly / gophers-code-reading-party

ʕ ◔ϖ◔ʔ
2 stars 2 forks source link

20191113 Gophers Code Reading Party #33

Open izumin5210 opened 4 years ago

izumin5210 commented 4 years ago

201911131900 ~ @ 5F Lounge, Wantedly, Inc. Tokyo HQ

WHY

Go 完全に理解したい

WHAT

とりあえず読みたいものを書いていきましょう!

izumin5210 commented 4 years ago

https://kawasin73.hatenablog.com/entry/2019/11/10/112301 https://hnakamur.github.io/blog/2018/01/30/go-heap-allocations/

izumin5210 commented 4 years ago
izumin5210 commented 4 years ago

ちょっと実験した reader が io.WriterTo を実装してるかどうかでも変わりそうな気もするけど… MBP 上で適当に100回やっただけなので、ちゃんと EC2 の上でちゃんと http server 通してやるとまた結果が変わりそう

``` name time/op Decode/1/ReadAll-8 10.0µs ± 2% Decode/1/Decoder-8 6.31µs ± 4% Decode/1/Copy-8 10.1µs ± 2% Decode/10/ReadAll-8 18.1µs ± 4% Decode/10/Decoder-8 15.9µs ± 3% Decode/10/Copy-8 18.2µs ± 4% Decode/100/ReadAll-8 100µs ± 6% Decode/100/Decoder-8 101µs ± 2% Decode/100/Copy-8 101µs ±10% Decode/1000/ReadAll-8 926µs ± 6% Decode/1000/Decoder-8 933µs ± 7% Decode/1000/Copy-8 925µs ± 7% name alloc/op Decode/1/ReadAll-8 2.87kB ± 0% Decode/1/Decoder-8 1.57kB ± 0% Decode/1/Copy-8 2.92kB ± 0% Decode/10/ReadAll-8 3.65kB ± 0% Decode/10/Decoder-8 2.35kB ± 0% Decode/10/Copy-8 3.70kB ± 0% Decode/100/ReadAll-8 23.7kB ± 0% Decode/100/Decoder-8 24.0kB ± 0% Decode/100/Copy-8 23.7kB ± 0% Decode/1000/ReadAll-8 217kB ± 1% Decode/1000/Decoder-8 215kB ± 1% Decode/1000/Copy-8 218kB ± 1% name allocs/op Decode/1/ReadAll-8 20.0 ± 0% Decode/1/Decoder-8 22.0 ± 0% Decode/1/Copy-8 21.0 ± 0% Decode/10/ReadAll-8 45.0 ± 0% Decode/10/Decoder-8 47.0 ± 0% Decode/10/Copy-8 46.0 ± 0% Decode/100/ReadAll-8 329 ± 0% Decode/100/Decoder-8 332 ± 0% Decode/100/Copy-8 330 ± 0% Decode/1000/ReadAll-8 3.04k ± 0% Decode/1000/Decoder-8 3.05k ± 0% Decode/1000/Copy-8 3.04k ± 0% ```
```go package hx import ( "bytes" "encoding/json" "fmt" "io" "io/ioutil" "testing" ) func BenchmarkDecode(b *testing.B) { type Message struct { UserID int `json:"user_id"` Body string `json:"body"` } type Thread struct { Messages []*Message } for _, n := range []int{1, 10, 100, 1000} { n := n b.Run(fmt.Sprint(n), func(b *testing.B) { t := &Thread{Messages: make([]*Message, n)} for i := 0; i < n; i++ { t.Messages[i] = &Message{ UserID: i + 1, Body: "Hello, World!", } } getReader := func() io.Reader { r, w := io.Pipe() go func() { defer w.Close() json.NewEncoder(w).Encode(t) }() return r } b.ResetTimer() b.Run("ReadAll", func(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { var out Thread data, err := ioutil.ReadAll(getReader()) if err != nil { b.Errorf("unexpected error") } err = json.Unmarshal(data, &out) if err != nil { b.Errorf("unexpected error") } if got, want := len(out.Messages), n; got != want { b.Errorf("retuned %d messages, want %d", got, want) } } }) b.Run("Decoder", func(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { var out Thread err := json.NewDecoder(getReader()).Decode(&out) if err != nil { b.Errorf("unexpected error") } if got, want := len(out.Messages), n; got != want { b.Errorf("retuned %d messages, want %d", got, want) } } }) b.Run("Copy", func(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { var out Thread var buf bytes.Buffer _, err := io.Copy(&buf, getReader()) if err != nil { b.Errorf("unexpected error") } err = json.Unmarshal(buf.Bytes(), &out) if err != nil { b.Errorf("unexpected error") } if got, want := len(out.Messages), n; got != want { b.Errorf("retuned %d messages, want %d", got, want) } } }) }) } } ```