go-toml
go-toml copied to clipboard
Decode: slices specialization
Taking a shot at specializing unmarshal code to work on concrete types instead of fully in reflect land.
At the moment I experimented with UnmarshalArray
, as it has simpler semantics than the rest. I only specialized unmarshaling into []interface{}
.
Results are quite encouraging!
name old time/op new time/op delta
UnmarshalDataset/config-2 24.3ms ± 1% 24.0ms ± 0% -1.06% (p=0.008 n=5+5)
UnmarshalDataset/canada-2 85.8ms ± 0% 66.2ms ± 0% -22.87% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 27.2ms ± 3% 25.5ms ± 0% -6.29% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 10.8ms ± 2% 10.8ms ± 2% ~ (p=0.548 n=5+5)
UnmarshalDataset/code-2 107ms ± 1% 108ms ± 7% ~ (p=0.841 n=5+5)
UnmarshalDataset/example-2 181µs ± 2% 177µs ± 0% -2.15% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 530ns ± 1% 542ns ± 0% +2.23% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 807ns ± 1% 812ns ± 0% ~ (p=0.151 n=5+5)
Unmarshal/ReferenceFile/struct-2 53.6µs ± 2% 52.2µs ± 0% -2.69% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 82.5µs ± 0% 79.7µs ± 0% -3.46% (p=0.016 n=4+5)
Unmarshal/HugoFrontMatter-2 14.6µs ± 3% 13.6µs ± 0% -6.31% (p=0.008 n=5+5)
name old speed new speed delta
UnmarshalDataset/config-2 43.1MB/s ± 1% 43.6MB/s ± 0% +1.08% (p=0.008 n=5+5)
UnmarshalDataset/canada-2 25.7MB/s ± 0% 33.3MB/s ± 0% +29.66% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 20.6MB/s ± 3% 21.9MB/s ± 0% +6.68% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 40.9MB/s ± 2% 40.8MB/s ± 2% ~ (p=0.548 n=5+5)
UnmarshalDataset/code-2 25.0MB/s ± 1% 24.8MB/s ± 6% ~ (p=0.841 n=5+5)
UnmarshalDataset/example-2 44.7MB/s ± 2% 45.7MB/s ± 0% +2.20% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 20.8MB/s ± 1% 20.3MB/s ± 0% -2.19% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 13.6MB/s ± 1% 13.5MB/s ± 0% ~ (p=0.159 n=5+5)
Unmarshal/ReferenceFile/struct-2 97.8MB/s ± 2% 100.5MB/s ± 0% +2.74% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 63.5MB/s ± 0% 65.8MB/s ± 0% +3.59% (p=0.016 n=4+5)
Unmarshal/HugoFrontMatter-2 37.5MB/s ± 3% 40.0MB/s ± 0% +6.71% (p=0.008 n=5+5)
name old alloc/op new alloc/op delta
UnmarshalDataset/config-2 5.92MB ± 0% 5.85MB ± 0% -1.05% (p=0.008 n=5+5)
UnmarshalDataset/canada-2 84.4MB ± 0% 77.3MB ± 0% -8.34% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 35.8MB ± 0% 35.3MB ± 0% -1.33% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 13.5MB ± 0% 13.5MB ± 0% -0.17% (p=0.008 n=5+5)
UnmarshalDataset/code-2 22.3MB ± 0% 22.3MB ± 0% ~ (p=0.135 n=5+5)
UnmarshalDataset/example-2 205kB ± 0% 204kB ± 0% -0.55% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 581B ± 0% 581B ± 0% ~ (all equal)
Unmarshal/SimpleDocument/map-2 957B ± 0% 957B ± 0% ~ (all equal)
Unmarshal/ReferenceFile/struct-2 20.8kB ± 0% 20.5kB ± 0% -1.46% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 38.1kB ± 0% 37.1kB ± 0% -2.62% (p=0.000 n=4+5)
Unmarshal/HugoFrontMatter-2 7.38kB ± 0% 7.14kB ± 0% -3.25% (p=0.008 n=5+5)
name old allocs/op new allocs/op delta
UnmarshalDataset/config-2 233k ± 0% 230k ± 0% -1.33% (p=0.008 n=5+5)
UnmarshalDataset/canada-2 782k ± 0% 447k ± 0% -42.78% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 192k ± 0% 169k ± 0% -12.38% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 56.9k ± 0% 55.8k ± 0% -2.00% (p=0.008 n=5+5)
UnmarshalDataset/code-2 1.06M ± 0% 1.06M ± 0% ~ (all equal)
UnmarshalDataset/example-2 1.36k ± 0% 1.31k ± 0% -4.10% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 7.00 ± 0% 7.00 ± 0% ~ (all equal)
Unmarshal/SimpleDocument/map-2 12.0 ± 0% 12.0 ± 0% ~ (all equal)
Unmarshal/ReferenceFile/struct-2 182 ± 0% 167 ± 0% -8.24% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 649 ± 0% 599 ± 0% -7.70% (p=0.008 n=5+5)
Unmarshal/HugoFrontMatter-2 143 ± 0% 131 ± 0% -8.39% (p=0.008 n=5+5)
Implemented a specialized generator that works for any slice type. Though this works well on benchmarks that use multiple slice types (ReferenceFile/struct
), there is a bit of overhead for the others that basically just use []interface{}
:
Given TOML is often use in short lived programs (interactive CLI), it probably worth considering keeping a separate function just for the popular []interface{}
to avoid any extra allocation (the cache and the specialized function) for such programs.
name old time/op new time/op delta
UnmarshalDataset/config-2 24.3ms ± 1% 24.9ms ± 0% +2.27% (p=0.016 n=5+4)
UnmarshalDataset/canada-2 85.8ms ± 0% 66.3ms ± 0% -22.77% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 27.2ms ± 3% 25.0ms ± 0% -8.06% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 10.8ms ± 2% 10.8ms ± 2% ~ (p=1.000 n=5+5)
UnmarshalDataset/code-2 107ms ± 1% 108ms ± 0% ~ (p=0.151 n=5+5)
UnmarshalDataset/example-2 181µs ± 2% 176µs ± 0% -2.70% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 530ns ± 1% 579ns ± 0% +9.21% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 807ns ± 1% 867ns ± 0% +7.44% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 53.6µs ± 2% 49.5µs ± 0% -7.67% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 82.5µs ± 0% 80.3µs ± 0% -2.68% (p=0.016 n=4+5)
Unmarshal/HugoFrontMatter-2 14.6µs ± 3% 13.9µs ± 0% -4.67% (p=0.008 n=5+5)
name old speed new speed delta
UnmarshalDataset/config-2 43.1MB/s ± 1% 42.2MB/s ± 0% -2.22% (p=0.016 n=5+4)
UnmarshalDataset/canada-2 25.7MB/s ± 0% 33.2MB/s ± 0% +29.50% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 20.6MB/s ± 3% 22.3MB/s ± 0% +8.71% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 40.9MB/s ± 2% 40.9MB/s ± 2% ~ (p=1.000 n=5+5)
UnmarshalDataset/code-2 25.0MB/s ± 1% 24.8MB/s ± 0% ~ (p=0.151 n=5+5)
UnmarshalDataset/example-2 44.7MB/s ± 2% 45.9MB/s ± 0% +2.76% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 20.8MB/s ± 1% 19.0MB/s ± 0% -8.42% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 13.6MB/s ± 1% 12.7MB/s ± 0% -6.96% (p=0.016 n=5+4)
Unmarshal/ReferenceFile/struct-2 97.8MB/s ± 2% 105.9MB/s ± 0% +8.28% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 63.5MB/s ± 0% 65.3MB/s ± 0% +2.75% (p=0.016 n=4+5)
Unmarshal/HugoFrontMatter-2 37.5MB/s ± 3% 39.3MB/s ± 0% +4.87% (p=0.008 n=5+5)
name old alloc/op new alloc/op delta
UnmarshalDataset/config-2 5.92MB ± 0% 5.85MB ± 0% -1.05% (p=0.008 n=5+5)
UnmarshalDataset/canada-2 84.4MB ± 0% 76.6MB ± 0% -9.25% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 35.8MB ± 0% 35.3MB ± 0% -1.33% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 13.5MB ± 0% 13.5MB ± 0% -0.16% (p=0.008 n=5+5)
UnmarshalDataset/code-2 22.3MB ± 0% 22.3MB ± 0% +0.00% (p=0.008 n=5+5)
UnmarshalDataset/example-2 205kB ± 0% 204kB ± 0% -0.48% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 581B ± 0% 709B ± 0% +22.03% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 957B ± 0% 1085B ± 0% +13.38% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 20.8kB ± 0% 19.8kB ± 0% -4.74% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 38.1kB ± 0% 37.3kB ± 0% -2.29% (p=0.029 n=4+4)
Unmarshal/HugoFrontMatter-2 7.38kB ± 0% 7.26kB ± 0% -1.52% (p=0.008 n=5+5)
name old allocs/op new allocs/op delta
UnmarshalDataset/config-2 233k ± 0% 230k ± 0% -1.33% (p=0.000 n=5+4)
UnmarshalDataset/canada-2 782k ± 0% 447k ± 0% -42.78% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 192k ± 0% 169k ± 0% -12.38% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 56.9k ± 0% 55.8k ± 0% -1.99% (p=0.008 n=5+5)
UnmarshalDataset/code-2 1.06M ± 0% 1.06M ± 0% +0.00% (p=0.008 n=5+5)
UnmarshalDataset/example-2 1.36k ± 0% 1.31k ± 0% -4.03% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 7.00 ± 0% 8.00 ± 0% +14.29% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 12.0 ± 0% 13.0 ± 0% +8.33% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 182 ± 0% 125 ± 0% -31.32% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 649 ± 0% 600 ± 0% -7.55% (p=0.008 n=5+5)
Unmarshal/HugoFrontMatter-2 143 ± 0% 132 ± 0% -7.69% (p=0.008 n=5+5)
name old time/op new time/op delta
UnmarshalDataset/config-2 24.3ms ± 1% 24.7ms ± 0% +1.66% (p=0.016 n=5+4)
UnmarshalDataset/canada-2 85.8ms ± 0% 62.5ms ± 1% -27.20% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 27.2ms ± 3% 24.2ms ± 2% -11.01% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 10.8ms ± 2% 10.7ms ± 0% ~ (p=0.151 n=5+5)
UnmarshalDataset/code-2 107ms ± 1% 106ms ± 0% -1.02% (p=0.032 n=5+5)
UnmarshalDataset/example-2 181µs ± 2% 173µs ± 0% -4.54% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 530ns ± 1% 566ns ± 0% +6.72% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 807ns ± 1% 869ns ± 0% +7.65% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 53.6µs ± 2% 49.0µs ± 0% -8.51% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 82.5µs ± 0% 78.8µs ± 0% -4.53% (p=0.016 n=4+5)
Unmarshal/HugoFrontMatter-2 14.6µs ± 3% 13.6µs ± 0% -6.91% (p=0.008 n=5+5)
name old speed new speed delta
UnmarshalDataset/config-2 43.1MB/s ± 1% 42.4MB/s ± 0% -1.63% (p=0.016 n=5+4)
UnmarshalDataset/canada-2 25.7MB/s ± 0% 35.2MB/s ± 1% +37.37% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 20.6MB/s ± 3% 23.1MB/s ± 2% +12.34% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 40.9MB/s ± 2% 41.3MB/s ± 0% ~ (p=0.151 n=5+5)
UnmarshalDataset/code-2 25.0MB/s ± 1% 25.3MB/s ± 0% +1.02% (p=0.032 n=5+5)
UnmarshalDataset/example-2 44.7MB/s ± 2% 46.8MB/s ± 0% +4.75% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 20.8MB/s ± 1% 19.4MB/s ± 0% -6.30% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 13.6MB/s ± 1% 12.7MB/s ± 0% -7.09% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 97.8MB/s ± 2% 106.9MB/s ± 0% +9.27% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 63.5MB/s ± 0% 66.5MB/s ± 0% +4.74% (p=0.016 n=4+5)
Unmarshal/HugoFrontMatter-2 37.5MB/s ± 3% 40.3MB/s ± 0% +7.40% (p=0.008 n=5+5)
name old alloc/op new alloc/op delta
UnmarshalDataset/config-2 5.92MB ± 0% 5.85MB ± 0% -1.05% (p=0.008 n=5+5)
UnmarshalDataset/canada-2 84.4MB ± 0% 75.2MB ± 0% -10.84% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 35.8MB ± 0% 35.0MB ± 0% -2.03% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 13.5MB ± 0% 13.5MB ± 0% -0.35% (p=0.008 n=5+5)
UnmarshalDataset/code-2 22.3MB ± 0% 22.0MB ± 0% -1.30% (p=0.008 n=5+5)
UnmarshalDataset/example-2 205kB ± 0% 203kB ± 0% -0.83% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 581B ± 0% 709B ± 0% +22.03% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 957B ± 0% 1085B ± 0% +13.38% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 20.8kB ± 0% 19.7kB ± 0% -4.97% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 38.1kB ± 0% 37.0kB ± 0% -2.92% (p=0.029 n=4+4)
Unmarshal/HugoFrontMatter-2 7.38kB ± 0% 7.22kB ± 0% -2.17% (p=0.008 n=5+5)
name old allocs/op new allocs/op delta
UnmarshalDataset/config-2 233k ± 0% 230k ± 0% -1.33% (p=0.000 n=5+4)
UnmarshalDataset/canada-2 782k ± 0% 391k ± 0% -49.95% (p=0.008 n=5+5)
UnmarshalDataset/citm_catalog-2 192k ± 0% 158k ± 0% -17.81% (p=0.008 n=5+5)
UnmarshalDataset/twitter-2 56.9k ± 0% 54.7k ± 0% -3.84% (p=0.008 n=5+5)
UnmarshalDataset/code-2 1.06M ± 0% 1.05M ± 0% -1.14% (p=0.008 n=5+5)
UnmarshalDataset/example-2 1.36k ± 0% 1.28k ± 0% -6.15% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/struct-2 7.00 ± 0% 8.00 ± 0% +14.29% (p=0.008 n=5+5)
Unmarshal/SimpleDocument/map-2 12.0 ± 0% 13.0 ± 0% +8.33% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/struct-2 182 ± 0% 123 ± 0% -32.42% (p=0.008 n=5+5)
Unmarshal/ReferenceFile/map-2 649 ± 0% 590 ± 0% -9.09% (p=0.008 n=5+5)
Unmarshal/HugoFrontMatter-2 143 ± 0% 130 ± 0% -9.09% (p=0.008 n=5+5)