- commit
- 7ac0b40b20381309a948070efde6bf158f0b75be
- parent
- a3b48390827ef63b58d657612023e343b90bdc58
- Author
- tfh <tfh@skip.org>
- Date
- 2020-05-26 17:57
Merge pull request #33 from vsenko/occasional-byte-encoding-efficiency-over-mixed-encoding Occasional byte encoding efficiency over mixed encoding
Diffstat
| M | encoder.go | 19 | +++++++++++++++++++ |
| M | encoder_test.go | 37 | ++++++++++++++++++++++++++++++++++--- |
2 files changed, 53 insertions, 3 deletions
diff --git a/encoder.go b/encoder.go
@@ -180,6 +180,25 @@ func (d *dataEncoder) encode(data []byte) (*bitset.Bitset, error) {
180 180 return nil, err
181 181 }
182 182
-1 183 // Check if a single byte encoded segment would be more efficient.
-1 184 optimizedLength := 0
-1 185 for _, s := range d.optimised {
-1 186 length, err := d.encodedLength(s.dataMode, len(s.data))
-1 187 if err != nil {
-1 188 return nil, err
-1 189 }
-1 190 optimizedLength += length
-1 191 }
-1 192
-1 193 singleByteSegmentLength, err := d.encodedLength(dataModeByte, len(d.data))
-1 194 if err != nil {
-1 195 return nil, err
-1 196 }
-1 197
-1 198 if singleByteSegmentLength <= optimizedLength {
-1 199 d.optimised = []segment{segment{dataMode: dataModeByte, data: d.data}}
-1 200 }
-1 201
183 202 // Encode data.
184 203 encoded := bitset.New()
185 204 for _, s := range d.optimised {
diff --git a/encoder_test.go b/encoder_test.go
@@ -180,17 +180,49 @@ func TestOptimiseEncoding(t *testing.T) {
180 180 {
181 181 dataEncoderType1To9,
182 182 []testModeSegment{
-1 183 {dataModeAlphanumeric, 100},
-1 184 {dataModeByte, 1},
-1 185 {dataModeNumeric, 1},
-1 186 },
-1 187 []testModeSegment{
-1 188 {dataModeAlphanumeric, 100},
-1 189 {dataModeByte, 2},
-1 190 },
-1 191 },
-1 192 // Sometimes encoding everything as bytes is more efficient.
-1 193 {
-1 194 dataEncoderType1To9,
-1 195 []testModeSegment{
183 196 {dataModeAlphanumeric, 1},
184 197 {dataModeByte, 1},
185 198 {dataModeNumeric, 1},
186 199 },
187 200 []testModeSegment{
-1 201 {dataModeByte, 3},
-1 202 },
-1 203 },
-1 204 // https://www.google.com/123456789012345678901234567890
-1 205 // BBBBBAAABBBABBBBBBABBBANNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
-1 206 {
-1 207 dataEncoderType1To9,
-1 208 []testModeSegment{
-1 209 {dataModeByte, 5},
-1 210 {dataModeAlphanumeric, 3},
-1 211 {dataModeByte, 3},
188 212 {dataModeAlphanumeric, 1},
189 -1 {dataModeByte, 2},
-1 213 {dataModeByte, 6},
-1 214 {dataModeAlphanumeric, 1},
-1 215 {dataModeAlphanumeric, 4},
-1 216 {dataModeNumeric, 30},
-1 217 },
-1 218 []testModeSegment{
-1 219 {dataModeByte, 23},
-1 220 {dataModeNumeric, 30},
190 221 },
191 222 },
192 223 // https://www.google.com/123
193 224 // BBBBBAAABBBABBBBBBABBBANNN
-1 225 // Small segments are inefficient because of additional metadata.
194 226 {
195 227 dataEncoderType1To9,
196 228 []testModeSegment{
@@ -204,8 +236,7 @@ func TestOptimiseEncoding(t *testing.T) {
204 236 {dataModeNumeric, 3},
205 237 },
206 238 []testModeSegment{
207 -1 {dataModeByte, 23},
208 -1 {dataModeNumeric, 3},
-1 239 {dataModeByte, 26},
209 240 },
210 241 },
211 242 // HTTPS://WWW.GOOGLE.COM/123