Commit 9daf5ca
authored
Improve packed field decoding (#959)
- Inline `_readPacked` manually and `_withLimit` with a pragma to eliminate
closure allocation and calls in packed decoding loops.
- `_readPacked` is manually inlined as VM's inliner doesn't properly fold
constants after the inlinings, see
dart-lang/sdk#60068.
- Introduce `PbList._addUnchecked` to add to the list without checking the
value for validity and list for mutability.
- When decoding a packed field, check the list mutability once, instead of for
every element.
- When decoding a packed scalar field, don't check for value validity.
For scalar fields we need to make sure the field value is not null, which is
already guaranteed in the call sites as e.g. `input.readDouble` doesn't
return nullable.
- Sprinkle a bunch of `prefer-inline`s to make sure VM will inline one liners.
VM benchmarks before:
```
protobuf_PackedInt32Decoding(RunTimeRaw): 25598.8125 us.
protobuf_PackedInt64Decoding(RunTimeRaw): 67932.43333333333 us.
protobuf_PackedUint32Decoding(RunTimeRaw): 24668.844444444443 us.
protobuf_PackedUint64Decoding(RunTimeRaw): 64615.066666666666 us.
protobuf_PackedSint32Decoding(RunTimeRaw): 26037.275 us.
protobuf_PackedSint64Decoding(RunTimeRaw): 100819.65 us.
protobuf_PackedBoolDecoding(RunTimeRaw): 34733.4 us.
protobuf_PackedEnumDecoding(RunTimeRaw): 48379.659999999996 us.
```
VM benchmarks after:
```
protobuf_PackedInt32Decoding(RunTimeRaw): 19653.9 us.
protobuf_PackedInt64Decoding(RunTimeRaw): 48627.9 us.
protobuf_PackedUint32Decoding(RunTimeRaw): 19279.29090909091 us.
protobuf_PackedUint64Decoding(RunTimeRaw): 50681.8 us.
protobuf_PackedSint32Decoding(RunTimeRaw): 20271.854545454546 us.
protobuf_PackedSint64Decoding(RunTimeRaw): 83777.8 us.
protobuf_PackedBoolDecoding(RunTimeRaw): 24850.555555555555 us.
protobuf_PackedEnumDecoding(RunTimeRaw): 45205.659999999996 us.
```
Wasm benchmarks before (`-O2`):
```
protobuf_PackedInt32Decoding(RunTimeRaw): 64220.0 us.
protobuf_PackedInt64Decoding(RunTimeRaw): 81033.33333333334 us.
protobuf_PackedUint32Decoding(RunTimeRaw): 60800.0 us.
protobuf_PackedUint64Decoding(RunTimeRaw): 82700.0 us.
protobuf_PackedSint32Decoding(RunTimeRaw): 72433.33333333334 us.
protobuf_PackedSint64Decoding(RunTimeRaw): 142150.0 us.
protobuf_PackedBoolDecoding(RunTimeRaw): 27775.0 us.
protobuf_PackedEnumDecoding(RunTimeRaw): 43980.0 us.
```
Wasm benchmarks after:
```
protobuf_PackedInt32Decoding(RunTimeRaw): 56050.0 us.
protobuf_PackedInt64Decoding(RunTimeRaw): 74633.33333333334 us.
protobuf_PackedUint32Decoding(RunTimeRaw): 56525.0 us.
protobuf_PackedUint64Decoding(RunTimeRaw): 69400.0 us.
protobuf_PackedSint32Decoding(RunTimeRaw): 51925.0 us.
protobuf_PackedSint64Decoding(RunTimeRaw): 116250.0 us.
protobuf_PackedBoolDecoding(RunTimeRaw): 18427.272727272728 us.
protobuf_PackedEnumDecoding(RunTimeRaw): 41600.0 us.
```1 parent 1aaa332 commit 9daf5ca
File tree
10 files changed
+418
-37
lines changed- benchmarks
- bin
- protos
- tool
- protobuf
- lib/src/protobuf
10 files changed
+418
-37
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
1 | 7 | | |
2 | 8 | | |
3 | 9 | | |
| |||
0 commit comments