Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bson: improve marshal/unmarshal performance by ~58% and ~29%
This commit improves BSON marshaling performance by ~58% and unmarshaling performance by ~29% by replacing the mutex based decoder/encoder caches with sync.Map, which can often avoid locking and is ideally suited for caches that only grow. The commit also adds the BenchmarkCodeMarshal and BenchmarkCodeUnmarshal benchmarks from the Go standard library's encoding/json package since they do an excellent job of stress testing parallel encoding/decoding (a common use case in a database driver) and are how the lock contention that led to this commit were discovered. ``` goos: darwin goarch: arm64 pkg: go.mongodb.org/mongo-driver/bson │ base.20.txt │ new.20.txt │ │ sec/op │ sec/op vs base │ CodeUnmarshal/BSON-10 3.192m ± 1% 2.246m ± 1% -29.64% (p=0.000 n=20) CodeUnmarshal/JSON-10 2.735m ± 1% 2.737m ± 0% ~ (p=0.640 n=20) CodeMarshal/BSON-10 2.972m ± 0% 1.221m ± 3% -58.93% (p=0.000 n=20) CodeMarshal/JSON-10 471.0µ ± 1% 464.6µ ± 0% -1.36% (p=0.000 n=20) geomean 1.870m 1.366m -26.92% │ base.20.txt │ new.20.txt │ │ B/s │ B/s vs base │ CodeUnmarshal/BSON-10 579.7Mi ± 1% 823.9Mi ± 1% +42.13% (p=0.000 n=20) CodeUnmarshal/JSON-10 676.6Mi ± 1% 676.2Mi ± 0% ~ (p=0.640 n=20) CodeMarshal/BSON-10 622.7Mi ± 0% 1516.2Mi ± 3% +143.46% (p=0.000 n=20) CodeMarshal/JSON-10 3.837Gi ± 1% 3.890Gi ± 0% +1.38% (p=0.000 n=20) geomean 989.8Mi 1.323Gi +36.84% │ base.20.txt │ new.20.txt │ │ B/op │ B/op vs base │ CodeUnmarshal/BSON-10 4.219Mi ± 0% 4.219Mi ± 0% ~ (p=0.077 n=20) CodeUnmarshal/JSON-10 2.904Mi ± 0% 2.904Mi ± 0% ~ (p=0.672 n=20) CodeMarshal/BSON-10 2.821Mi ± 1% 2.776Mi ± 2% -1.59% (p=0.023 n=20) CodeMarshal/JSON-10 1.857Mi ± 0% 1.859Mi ± 0% ~ (p=0.331 n=20) geomean 2.830Mi 2.820Mi -0.37% │ base.20.txt │ new.20.txt │ │ allocs/op │ allocs/op vs base │ CodeUnmarshal/BSON-10 230.4k ± 0% 230.4k ± 0% ~ (p=1.000 n=20) CodeUnmarshal/JSON-10 92.67k ± 0% 92.67k ± 0% ~ (p=1.000 n=20) ¹ CodeMarshal/BSON-10 94.07k ± 0% 94.07k ± 0% ~ (p=0.112 n=20) CodeMarshal/JSON-10 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=20) ¹ geomean 6.694k 6.694k +0.00% ¹ all samples are equal ```
- Loading branch information