Commit 987a8a2
committed
value: special-case a bunch of primitive numeric types in from_bits
In practice it is overwhelmingly common to be parsing basic numeric
types like u64, and minor variations on these (e.g. options of them).
In particular this happens if your types come from the source or target
of pretty-much any jet.
In these cases we can just copy bits directly from the iterator (which
with BitIter is extremely fast; we actually copy bytes) and rather than
constructing types, we can just copy them from the precomp list.
This gives us a massive speedup for large bitstrings. In particular you
can see that to parse a 64k blob tow takes about 45us, where before it
took about 200milliseconds. This is about a 4700x speedup.
test value::benches::bench_value_create_64k ... bench: 875,039.00 ns/iter (+/- 5,007.70)
test value::benches::bench_value_create_64k_compact ... bench: 45,258.88 ns/iter (+/- 169.22)
test value::benches::bench_value_create_64k_padded ... bench: 45,291.30 ns/iter (+/- 120.04)
test value::benches::bench_value_create_deep_some ... bench: 517,785.20 ns/iter (+/- 5,332.20)
test value::benches::bench_value_create_deep_some_compact ... bench: 215,135.87 ns/iter (+/- 2,219.73)
test value::benches::bench_value_create_deep_some_padded ... bench: 215,144.95 ns/iter (+/- 2,020.55)
test value::benches::bench_value_create_u2048 ... bench: 548,674.60 ns/iter (+/- 4,192.62)
test value::benches::bench_value_create_u2048_compact ... bench: 2,915.23 ns/iter (+/- 14.31)
test value::benches::bench_value_create_u2048_padded ... bench: 2,916.31 ns/iter (+/- 13.82)
test value::benches::bench_value_create_u64 ... bench: 12.48 ns/iter (+/- 0.05)
test value::benches::bench_value_create_u64_compact ... bench: 72.94 ns/iter (+/- 0.89)
test value::benches::bench_value_create_u64_padded ... bench: 71.93 ns/iter (+/- 0.72)
test value::benches::bench_value_display_64k ... bench: 9,685,460.80 ns/iter (+/- 48,509.31)
test value::benches::bench_value_display_deep_some ... bench: 309,437.20 ns/iter (+/- 5,402.57)
test value::benches::bench_value_display_u2024 ... bench: 597,713.20 ns/iter (+/- 3,601.65)
test value::benches::bench_value_display_u64 ... bench: 2,437.24 ns/iter (+/- 16.67)1 parent 3866225 commit 987a8a2
2 files changed
+59
-18
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
72 | 83 | | |
73 | 84 | | |
74 | 85 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
960 | 960 | | |
961 | 961 | | |
962 | 962 | | |
963 | | - | |
| 963 | + | |
964 | 964 | | |
965 | | - | |
966 | | - | |
967 | | - | |
968 | | - | |
969 | | - | |
970 | | - | |
971 | | - | |
972 | | - | |
973 | | - | |
974 | | - | |
975 | | - | |
| 965 | + | |
| 966 | + | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
976 | 991 | | |
977 | 992 | | |
978 | | - | |
979 | | - | |
980 | | - | |
981 | | - | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
982 | 1012 | | |
983 | | - | |
| 1013 | + | |
984 | 1014 | | |
985 | 1015 | | |
986 | 1016 | | |
| |||
0 commit comments