awakesecurity / proto3-wire

https://hackage.haskell.org/package/proto3-wire
Other
23 stars 30 forks source link

Improve performance of toMap when keys are mostly sorted #82

Closed jcarr-awake closed 2 years ago

jcarr-awake commented 2 years ago

There's probably more work needed for benchmarks, but this shows around 50% total speedup of parsing on a simple binary tree. This is an improvement because it increases fusion, whereas the original can never fuse

Old: benchmarking Parse int tree time 773.3 μs (769.8 μs .. 776.9 μs) 1.000 R² (1.000 R² .. 1.000 R²) mean 771.7 μs (770.1 μs .. 775.9 μs) std dev 7.755 μs (3.902 μs .. 14.59 μs) benchmarking Parse int rose tree time 1.170 μs (1.161 μs .. 1.180 μs) 1.000 R² (0.999 R² .. 1.000 R²) mean 1.171 μs (1.162 μs .. 1.188 μs) std dev 23.25 ns (14.62 ns .. 32.45 ns) variance introduced by outliers: 21% (moderately inflated)

New: benchmarking Parse int tree time 521.7 μs (520.3 μs .. 523.3 μs) 1.000 R² (1.000 R² .. 1.000 R²) mean 521.7 μs (520.4 μs .. 523.0 μs) std dev 4.302 μs (3.596 μs .. 5.186 μs)

benchmarking Parse int rose tree time 1.064 μs (1.061 μs .. 1.069 μs) 1.000 R² (1.000 R² .. 1.000 R²) mean 1.064 μs (1.060 μs .. 1.069 μs) std dev 10.01 ns (6.752 ns .. 14.37 ns)

Speedup:

Geometric Mean: 28%