Skip to content

Instantly share code, notes, and snippets.

@walkingeyerobot
Last active July 9, 2020 21:24
Show Gist options
  • Save walkingeyerobot/7215587961db5d0f2aed824a1d86e24b to your computer and use it in GitHub Desktop.
Save walkingeyerobot/7215587961db5d0f2aed824a1d86e24b to your computer and use it in GitHub Desktop.
$ benchcmp.exe old.txt new.txt
benchcmp is deprecated in favor of benchstat: https://pkg.go.dev/golang.org/x/perf/cmd/benchstat
benchmark old ns/op new ns/op delta
BenchmarkCodeEncoder-12 1353046 1336969 -1.19%
BenchmarkCodeMarshal-12 1426484 1437951 +0.80%
BenchmarkMarshalBytes/32-12 253 264 +4.35%
BenchmarkMarshalBytes/256-12 676 689 +1.92%
BenchmarkMarshalBytes/4096-12 6353 6363 +0.16%
BenchmarkCodeDecoder-12 6308452 6312691 +0.07%
BenchmarkUnicodeDecoder-12 310 314 +1.29%
BenchmarkDecoderStream-12 243 241 -0.82%
BenchmarkCodeUnmarshal-12 7572942 8171875 +7.91%
BenchmarkCodeUnmarshalReuse-12 6376348 7146440 +12.08%
BenchmarkUnmarshalString-12 78.9 79.1 +0.25%
BenchmarkUnmarshalFloat64-12 73.5 74.4 +1.22%
BenchmarkUnmarshalInt64-12 61.7 62.7 +1.62%
BenchmarkIssue10335-12 101 102 +0.99%
BenchmarkIssue34127-12 65.8 64.3 -2.28%
BenchmarkUnmapped-12 226 227 +0.44%
BenchmarkTypeFieldsCache/MissTypes1-12 10094 10111 +0.17%
BenchmarkTypeFieldsCache/MissTypes10-12 33754 34175 +1.25%
BenchmarkTypeFieldsCache/MissTypes100-12 174137 184813 +6.13%
BenchmarkTypeFieldsCache/MissTypes1000-12 1488600 1507870 +1.29%
BenchmarkTypeFieldsCache/MissTypes10000-12 13506159 13417305 -0.66%
BenchmarkTypeFieldsCache/MissTypes100000-12 137745912 138245788 +0.36%
BenchmarkTypeFieldsCache/MissTypes1000000-12 1805975700 1745945800 -3.32%
BenchmarkTypeFieldsCache/HitTypes1-12 5.73 5.92 +3.32%
BenchmarkTypeFieldsCache/HitTypes10-12 5.90 5.61 -4.92%
BenchmarkTypeFieldsCache/HitTypes100-12 5.81 5.63 -3.10%
BenchmarkTypeFieldsCache/HitTypes1000-12 5.81 5.75 -1.03%
BenchmarkTypeFieldsCache/HitTypes10000-12 5.64 6.13 +8.69%
BenchmarkTypeFieldsCache/HitTypes100000-12 5.64 8.64 +53.19%
BenchmarkTypeFieldsCache/HitTypes1000000-12 5.81 5.84 +0.52%
BenchmarkEncodeMarshaler-12 58.7 58.4 -0.51%
BenchmarkRemarshal-12 16739 16378 -2.16%
BenchmarkNumberIsValid-12 18.2 18.2 +0.00%
BenchmarkNumberIsValidRegexp-12 466 470 +0.86%
BenchmarkEncoderEncode-12 41.0 42.7 +4.15%
benchmark old MB/s new MB/s speedup
BenchmarkCodeEncoder-12 1434.15 1451.40 1.01x
BenchmarkCodeMarshal-12 1360.32 1349.47 0.99x
BenchmarkCodeDecoder-12 307.60 307.39 1.00x
BenchmarkUnicodeDecoder-12 45.09 44.60 0.99x
BenchmarkCodeUnmarshal-12 256.24 237.46 0.93x
BenchmarkCodeUnmarshalReuse-12 304.32 271.53 0.89x
benchmark old allocs new allocs delta
BenchmarkCodeEncoder-12 0 0 +0.00%
BenchmarkCodeMarshal-12 1 1 +0.00%
BenchmarkCodeDecoder-12 77449 77442 -0.01%
BenchmarkUnicodeDecoder-12 2 2 +0.00%
BenchmarkDecoderStream-12 1 1 +0.00%
BenchmarkCodeUnmarshal-12 92669 92669 +0.00%
BenchmarkCodeUnmarshalReuse-12 77460 77558 +0.13%
BenchmarkUnmarshalString-12 2 2 +0.00%
BenchmarkUnmarshalFloat64-12 2 2 +0.00%
BenchmarkUnmarshalInt64-12 1 1 +0.00%
BenchmarkIssue10335-12 3 3 +0.00%
BenchmarkIssue34127-12 1 1 +0.00%
BenchmarkUnmapped-12 4 4 +0.00%
BenchmarkEncodeMarshaler-12 1 1 +0.00%
BenchmarkEncoderEncode-12 0 0 +0.00%
benchmark old bytes new bytes delta
BenchmarkCodeEncoder-12 57507 57087 -0.73%
BenchmarkCodeMarshal-12 1941588 1941572 -0.00%
BenchmarkCodeDecoder-12 2672484 2667284 -0.19%
BenchmarkUnicodeDecoder-12 36 36 +0.00%
BenchmarkDecoderStream-12 8 8 +0.00%
BenchmarkCodeUnmarshal-12 3275086 3275101 +0.00%
BenchmarkCodeUnmarshalReuse-12 1932438 1941029 +0.44%
BenchmarkUnmarshalString-12 192 192 +0.00%
BenchmarkUnmarshalFloat64-12 180 180 +0.00%
BenchmarkUnmarshalInt64-12 176 176 +0.00%
BenchmarkIssue10335-12 200 200 +0.00%
BenchmarkIssue34127-12 32 32 +0.00%
BenchmarkUnmapped-12 232 232 +0.00%
BenchmarkEncodeMarshaler-12 4 4 +0.00%
BenchmarkEncoderEncode-12 0 0 +0.00%
$ benchstat.exe old.txt new.txt
name old time/op new time/op delta
CodeEncoder-12 1.35ms ┬▒ 0% 1.34ms ┬▒ 0% ~ (p=1.000 n=1+1)
CodeMarshal-12 1.43ms ┬▒ 0% 1.44ms ┬▒ 0% ~ (p=1.000 n=1+1)
MarshalBytes/32-12 253ns ┬▒ 0% 264ns ┬▒ 0% ~ (p=1.000 n=1+1)
MarshalBytes/256-12 676ns ┬▒ 0% 689ns ┬▒ 0% ~ (p=1.000 n=1+1)
MarshalBytes/4096-12 6.35┬╡s ┬▒ 0% 6.36┬╡s ┬▒ 0% ~ (p=1.000 n=1+1)
CodeDecoder-12 6.31ms ┬▒ 0% 6.31ms ┬▒ 0% ~ (p=1.000 n=1+1)
UnicodeDecoder-12 310ns ┬▒ 0% 314ns ┬▒ 0% ~ (p=1.000 n=1+1)
DecoderStream-12 243ns ┬▒ 0% 241ns ┬▒ 0% ~ (p=1.000 n=1+1)
CodeUnmarshal-12 7.57ms ┬▒ 0% 8.17ms ┬▒ 0% ~ (p=1.000 n=1+1)
CodeUnmarshalReuse-12 6.38ms ┬▒ 0% 7.15ms ┬▒ 0% ~ (p=1.000 n=1+1)
UnmarshalString-12 78.9ns ┬▒ 0% 79.1ns ┬▒ 0% ~ (p=1.000 n=1+1)
UnmarshalFloat64-12 73.5ns ┬▒ 0% 74.4ns ┬▒ 0% ~ (p=1.000 n=1+1)
UnmarshalInt64-12 61.7ns ┬▒ 0% 62.7ns ┬▒ 0% ~ (p=1.000 n=1+1)
Issue10335-12 101ns ┬▒ 0% 102ns ┬▒ 0% ~ (p=1.000 n=1+1)
Issue34127-12 65.8ns ┬▒ 0% 64.3ns ┬▒ 0% ~ (p=1.000 n=1+1)
Unmapped-12 226ns ┬▒ 0% 227ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes1-12 10.1┬╡s ┬▒ 0% 10.1┬╡s ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes10-12 33.8┬╡s ┬▒ 0% 34.2┬╡s ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes100-12 174┬╡s ┬▒ 0% 185┬╡s ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes1000-12 1.49ms ┬▒ 0% 1.51ms ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes10000-12 13.5ms ┬▒ 0% 13.4ms ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes100000-12 138ms ┬▒ 0% 138ms ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/MissTypes1000000-12 1.81s ┬▒ 0% 1.75s ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes1-12 5.73ns ┬▒ 0% 5.92ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes10-12 5.90ns ┬▒ 0% 5.61ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes100-12 5.81ns ┬▒ 0% 5.63ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes1000-12 5.81ns ┬▒ 0% 5.75ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes10000-12 5.64ns ┬▒ 0% 6.13ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes100000-12 5.64ns ┬▒ 0% 8.64ns ┬▒ 0% ~ (p=1.000 n=1+1)
TypeFieldsCache/HitTypes1000000-12 5.81ns ┬▒ 0% 5.84ns ┬▒ 0% ~ (p=1.000 n=1+1)
EncodeMarshaler-12 58.7ns ┬▒ 0% 58.4ns ┬▒ 0% ~ (p=1.000 n=1+1)
Remarshal-12 16.7┬╡s ┬▒ 0% 16.4┬╡s ┬▒ 0% ~ (p=1.000 n=1+1)
NumberIsValid-12 18.2ns ┬▒ 0% 18.2ns ┬▒ 0% ~ (all equal)
NumberIsValidRegexp-12 466ns ┬▒ 0% 470ns ┬▒ 0% ~ (p=1.000 n=1+1)
EncoderEncode-12 41.0ns ┬▒ 0% 42.7ns ┬▒ 0% ~ (p=1.000 n=1+1)
name old speed new speed delta
CodeEncoder-12 1.43GB/s ┬▒ 0% 1.45GB/s ┬▒ 0% ~ (p=1.000 n=1+1)
CodeMarshal-12 1.36GB/s ┬▒ 0% 1.35GB/s ┬▒ 0% ~ (p=1.000 n=1+1)
CodeDecoder-12 308MB/s ┬▒ 0% 307MB/s ┬▒ 0% ~ (p=1.000 n=1+1)
UnicodeDecoder-12 45.1MB/s ┬▒ 0% 44.6MB/s ┬▒ 0% ~ (p=1.000 n=1+1)
CodeUnmarshal-12 256MB/s ┬▒ 0% 237MB/s ┬▒ 0% ~ (p=1.000 n=1+1)
CodeUnmarshalReuse-12 304MB/s ┬▒ 0% 272MB/s ┬▒ 0% ~ (p=1.000 n=1+1)
name old alloc/op new alloc/op delta
CodeEncoder-12 57.5kB ┬▒ 0% 57.1kB ┬▒ 0% ~ (p=1.000 n=1+1)
CodeMarshal-12 1.94MB ┬▒ 0% 1.94MB ┬▒ 0% ~ (p=1.000 n=1+1)
CodeDecoder-12 2.67MB ┬▒ 0% 2.67MB ┬▒ 0% ~ (p=1.000 n=1+1)
UnicodeDecoder-12 36.0B ┬▒ 0% 36.0B ┬▒ 0% ~ (all equal)
DecoderStream-12 8.00B ┬▒ 0% 8.00B ┬▒ 0% ~ (all equal)
CodeUnmarshal-12 3.28MB ┬▒ 0% 3.28MB ┬▒ 0% ~ (p=1.000 n=1+1)
CodeUnmarshalReuse-12 1.93MB ┬▒ 0% 1.94MB ┬▒ 0% ~ (p=1.000 n=1+1)
UnmarshalString-12 192B ┬▒ 0% 192B ┬▒ 0% ~ (all equal)
UnmarshalFloat64-12 180B ┬▒ 0% 180B ┬▒ 0% ~ (all equal)
UnmarshalInt64-12 176B ┬▒ 0% 176B ┬▒ 0% ~ (all equal)
Issue10335-12 200B ┬▒ 0% 200B ┬▒ 0% ~ (all equal)
Issue34127-12 32.0B ┬▒ 0% 32.0B ┬▒ 0% ~ (all equal)
Unmapped-12 232B ┬▒ 0% 232B ┬▒ 0% ~ (all equal)
EncodeMarshaler-12 4.00B ┬▒ 0% 4.00B ┬▒ 0% ~ (all equal)
EncoderEncode-12 0.00B 0.00B ~ (all equal)
name old allocs/op new allocs/op delta
CodeEncoder-12 0.00 0.00 ~ (all equal)
CodeMarshal-12 1.00 ┬▒ 0% 1.00 ┬▒ 0% ~ (all equal)
CodeDecoder-12 77.4k ┬▒ 0% 77.4k ┬▒ 0% ~ (p=1.000 n=1+1)
UnicodeDecoder-12 2.00 ┬▒ 0% 2.00 ┬▒ 0% ~ (all equal)
DecoderStream-12 1.00 ┬▒ 0% 1.00 ┬▒ 0% ~ (all equal)
CodeUnmarshal-12 92.7k ┬▒ 0% 92.7k ┬▒ 0% ~ (all equal)
CodeUnmarshalReuse-12 77.5k ┬▒ 0% 77.6k ┬▒ 0% ~ (p=1.000 n=1+1)
UnmarshalString-12 2.00 ┬▒ 0% 2.00 ┬▒ 0% ~ (all equal)
UnmarshalFloat64-12 2.00 ┬▒ 0% 2.00 ┬▒ 0% ~ (all equal)
UnmarshalInt64-12 1.00 ┬▒ 0% 1.00 ┬▒ 0% ~ (all equal)
Issue10335-12 3.00 ┬▒ 0% 3.00 ┬▒ 0% ~ (all equal)
Issue34127-12 1.00 ┬▒ 0% 1.00 ┬▒ 0% ~ (all equal)
Unmapped-12 4.00 ┬▒ 0% 4.00 ┬▒ 0% ~ (all equal)
EncodeMarshaler-12 1.00 ┬▒ 0% 1.00 ┬▒ 0% ~ (all equal)
EncoderEncode-12 0.00 0.00 ~ (all equal)
// I added this to the end of encode_test.go
func BenchmarkRemarshal(b *testing.B) {
for i := 0; i < b.N; i++ {
testStrings := []string{
`{}`,
`{"foo":null}`,
`{"foo":0}`,
`{"foo":8}`}
for _, s := range testStrings {
var o OptionalIntHolder
if err := Unmarshal([]byte(s), &o); err != nil {
b.Errorf("TestRemarshal could not unmarshal %s: %s", s, err.Error())
}
s2, err := Marshal(o)
if err != nil {
b.Errorf("TestRemarshal could not marshal %v: %s", o, err.Error())
}
b.Logf("Started with %s, ended with %s", s, string(s2))
}
}
}
$ ../../../bin/go test -bench .
goos: windows
goarch: amd64
pkg: encoding/json
BenchmarkCodeEncoder-12 816 1336969 ns/op 1451.40 MB/s 57087 B/op 0 allocs/op
BenchmarkCodeMarshal-12 758 1437951 ns/op 1349.47 MB/s 1941572 B/op 1 allocs/op
BenchmarkMarshalBytes/32-12 4615212 264 ns/op
BenchmarkMarshalBytes/256-12 1639393 689 ns/op
BenchmarkMarshalBytes/4096-12 176481 6363 ns/op
BenchmarkCodeDecoder-12 163 6312691 ns/op 307.39 MB/s 2667284 B/op 77442 allocs/op
BenchmarkUnicodeDecoder-12 3883614 314 ns/op 44.60 MB/s 36 B/op 2 allocs/op
BenchmarkDecoderStream-12 4918162 241 ns/op 8 B/op 1 allocs/op
BenchmarkCodeUnmarshal-12 154 8171875 ns/op 237.46 MB/s 3275101 B/op 92669 allocs/op
BenchmarkCodeUnmarshalReuse-12 150 7146440 ns/op 271.53 MB/s 1941029 B/op 77558 allocs/op
BenchmarkUnmarshalString-12 14286054 79.1 ns/op 192 B/op 2 allocs/op
BenchmarkUnmarshalFloat64-12 15584920 74.4 ns/op 180 B/op 2 allocs/op
BenchmarkUnmarshalInt64-12 18750498 62.7 ns/op 176 B/op 1 allocs/op
BenchmarkIssue10335-12 11805492 102 ns/op 200 B/op 3 allocs/op
BenchmarkIssue34127-12 16216719 64.3 ns/op 32 B/op 1 allocs/op
BenchmarkUnmapped-12 5150360 227 ns/op 232 B/op 4 allocs/op
BenchmarkTypeFieldsCache/MissTypes1-12 113210 10111 ns/op
BenchmarkTypeFieldsCache/MissTypes10-12 32000 34175 ns/op
BenchmarkTypeFieldsCache/MissTypes100-12 6666 184813 ns/op
BenchmarkTypeFieldsCache/MissTypes1000-12 758 1507870 ns/op
BenchmarkTypeFieldsCache/MissTypes10000-12 85 13417305 ns/op
BenchmarkTypeFieldsCache/MissTypes100000-12 8 138245788 ns/op
BenchmarkTypeFieldsCache/MissTypes1000000-12 1 1745945800 ns/op
BenchmarkTypeFieldsCache/HitTypes1-12 199456269 5.92 ns/op
BenchmarkTypeFieldsCache/HitTypes10-12 222232713 5.61 ns/op
BenchmarkTypeFieldsCache/HitTypes100-12 217210249 5.63 ns/op
BenchmarkTypeFieldsCache/HitTypes1000-12 208347998 5.75 ns/op
BenchmarkTypeFieldsCache/HitTypes10000-12 196084134 6.13 ns/op
BenchmarkTypeFieldsCache/HitTypes100000-12 164054868 8.64 ns/op
BenchmarkTypeFieldsCache/HitTypes1000000-12 211280364 5.84 ns/op
BenchmarkEncodeMarshaler-12 20006401 58.4 ns/op 4 B/op 1 allocs/op
BenchmarkRemarshal-12 82184 16378 ns/op
--- BENCH: BenchmarkRemarshal-12
encode_test.go:1256: Started with {}, ended with {}
encode_test.go:1256: Started with {"foo":null}, ended with {"foo":null}
encode_test.go:1256: Started with {"foo":0}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":8}, ended with {"foo":8}
encode_test.go:1256: Started with {}, ended with {}
encode_test.go:1256: Started with {"foo":null}, ended with {"foo":null}
encode_test.go:1256: Started with {"foo":0}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":8}, ended with {"foo":8}
encode_test.go:1256: Started with {}, ended with {}
encode_test.go:1256: Started with {"foo":null}, ended with {"foo":null}
... [output truncated]
BenchmarkNumberIsValid-12 66671851 18.2 ns/op
BenchmarkNumberIsValidRegexp-12 2580633 470 ns/op
BenchmarkEncoderEncode-12 27273584 42.7 ns/op 0 B/op 0 allocs/op
PASS
ok encoding/json 92.882s
$ ../../../bin/go test -bench .
goos: windows
goarch: amd64
pkg: encoding/json
BenchmarkCodeEncoder-12 810 1353046 ns/op 1434.15 MB/s 57507 B/op 0 allocs/op
BenchmarkCodeMarshal-12 769 1426484 ns/op 1360.32 MB/s 1941588 B/op 1 allocs/op
BenchmarkMarshalBytes/32-12 4724221 253 ns/op
BenchmarkMarshalBytes/256-12 1772534 676 ns/op
BenchmarkMarshalBytes/4096-12 184622 6353 ns/op
BenchmarkCodeDecoder-12 162 6308452 ns/op 307.60 MB/s 2672484 B/op 77449 allocs/op
BenchmarkUnicodeDecoder-12 4067678 310 ns/op 45.09 MB/s 36 B/op 2 allocs/op
BenchmarkDecoderStream-12 5063055 243 ns/op 8 B/op 1 allocs/op
BenchmarkCodeUnmarshal-12 164 7572942 ns/op 256.24 MB/s 3275086 B/op 92669 allocs/op
BenchmarkCodeUnmarshalReuse-12 162 6376348 ns/op 304.32 MB/s 1932438 B/op 77460 allocs/op
BenchmarkUnmarshalString-12 14286070 78.9 ns/op 192 B/op 2 allocs/op
BenchmarkUnmarshalFloat64-12 15584860 73.5 ns/op 180 B/op 2 allocs/op
BenchmarkUnmarshalInt64-12 19636658 61.7 ns/op 176 B/op 1 allocs/op
BenchmarkIssue10335-12 11538793 101 ns/op 200 B/op 3 allocs/op
BenchmarkIssue34127-12 17143395 65.8 ns/op 32 B/op 1 allocs/op
BenchmarkUnmapped-12 5217554 226 ns/op 232 B/op 4 allocs/op
BenchmarkTypeFieldsCache/MissTypes1-12 112150 10094 ns/op
BenchmarkTypeFieldsCache/MissTypes10-12 37150 33754 ns/op
BenchmarkTypeFieldsCache/MissTypes100-12 7058 174137 ns/op
BenchmarkTypeFieldsCache/MissTypes1000-12 874 1488600 ns/op
BenchmarkTypeFieldsCache/MissTypes10000-12 85 13506159 ns/op
BenchmarkTypeFieldsCache/MissTypes100000-12 8 137745912 ns/op
BenchmarkTypeFieldsCache/MissTypes1000000-12 1 1805975700 ns/op
BenchmarkTypeFieldsCache/HitTypes1-12 208129614 5.73 ns/op
BenchmarkTypeFieldsCache/HitTypes10-12 197050190 5.90 ns/op
BenchmarkTypeFieldsCache/HitTypes100-12 215446470 5.81 ns/op
BenchmarkTypeFieldsCache/HitTypes1000-12 197060638 5.81 ns/op
BenchmarkTypeFieldsCache/HitTypes10000-12 213529551 5.64 ns/op
BenchmarkTypeFieldsCache/HitTypes100000-12 209885524 5.64 ns/op
BenchmarkTypeFieldsCache/HitTypes1000000-12 208384902 5.81 ns/op
BenchmarkEncodeMarshaler-12 21053997 58.7 ns/op 4 B/op 1 allocs/op
BenchmarkRemarshal-12 79033 16739 ns/op
--- BENCH: BenchmarkRemarshal-12
encode_test.go:1256: Started with {}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":null}, ended with {"foo":null}
encode_test.go:1256: Started with {"foo":0}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":8}, ended with {"foo":8}
encode_test.go:1256: Started with {}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":null}, ended with {"foo":null}
encode_test.go:1256: Started with {"foo":0}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":8}, ended with {"foo":8}
encode_test.go:1256: Started with {}, ended with {"foo":0}
encode_test.go:1256: Started with {"foo":null}, ended with {"foo":null}
... [output truncated]
BenchmarkNumberIsValid-12 66669628 18.2 ns/op
BenchmarkNumberIsValidRegexp-12 2597359 466 ns/op
BenchmarkEncoderEncode-12 29630287 41.0 ns/op 0 B/op 0 allocs/op
PASS
ok encoding/json 88.793s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment