@@ -84,11 +84,11 @@ type huffmanBitWriter struct {
84
84
bits uint64
85
85
nbits uint
86
86
bytes [bufferSize ]byte
87
+ codegenFreq [codegenCodeCount ]int32
87
88
nbytes int
88
89
literalFreq []int32
89
90
offsetFreq []int32
90
91
codegen []uint8
91
- codegenFreq []int32
92
92
literalEncoding * huffmanEncoder
93
93
offsetEncoding * huffmanEncoder
94
94
codegenEncoding * huffmanEncoder
@@ -101,7 +101,6 @@ func newHuffmanBitWriter(w io.Writer) *huffmanBitWriter {
101
101
literalFreq : make ([]int32 , maxNumLit ),
102
102
offsetFreq : make ([]int32 , offsetCodeCount ),
103
103
codegen : make ([]uint8 , maxNumLit + offsetCodeCount + 1 ),
104
- codegenFreq : make ([]int32 , codegenCodeCount ),
105
104
literalEncoding : newHuffmanEncoder (maxNumLit ),
106
105
codegenEncoding : newHuffmanEncoder (codegenCodeCount ),
107
106
offsetEncoding : newHuffmanEncoder (offsetCodeCount ),
@@ -143,12 +142,13 @@ func (w *huffmanBitWriter) writeBits(b int32, nb uint) {
143
142
w .bits >>= 48
144
143
w .nbits -= 48
145
144
n := w .nbytes
146
- w .bytes [n + 0 ] = byte (bits )
147
- w .bytes [n + 1 ] = byte (bits >> 8 )
148
- w .bytes [n + 2 ] = byte (bits >> 16 )
149
- w .bytes [n + 3 ] = byte (bits >> 24 )
150
- w .bytes [n + 4 ] = byte (bits >> 32 )
151
- w .bytes [n + 5 ] = byte (bits >> 40 )
145
+ bytes := w .bytes [n : n + 6 ]
146
+ bytes [0 ] = byte (bits )
147
+ bytes [1 ] = byte (bits >> 8 )
148
+ bytes [2 ] = byte (bits >> 16 )
149
+ bytes [3 ] = byte (bits >> 24 )
150
+ bytes [4 ] = byte (bits >> 32 )
151
+ bytes [5 ] = byte (bits >> 40 )
152
152
n += 6
153
153
if n >= bufferFlushSize {
154
154
_ , w .err = w .w .Write (w .bytes [:n ])
@@ -293,12 +293,13 @@ func (w *huffmanBitWriter) writeCode(c hcode) {
293
293
w .bits >>= 48
294
294
w .nbits -= 48
295
295
n := w .nbytes
296
- w .bytes [n + 0 ] = byte (bits )
297
- w .bytes [n + 1 ] = byte (bits >> 8 )
298
- w .bytes [n + 2 ] = byte (bits >> 16 )
299
- w .bytes [n + 3 ] = byte (bits >> 24 )
300
- w .bytes [n + 4 ] = byte (bits >> 32 )
301
- w .bytes [n + 5 ] = byte (bits >> 40 )
296
+ bytes := w .bytes [n : n + 6 ]
297
+ bytes [0 ] = byte (bits )
298
+ bytes [1 ] = byte (bits >> 8 )
299
+ bytes [2 ] = byte (bits >> 16 )
300
+ bytes [3 ] = byte (bits >> 24 )
301
+ bytes [4 ] = byte (bits >> 32 )
302
+ bytes [5 ] = byte (bits >> 40 )
302
303
n += 6
303
304
if n >= bufferFlushSize {
304
305
_ , w .err = w .w .Write (w .bytes [:n ])
@@ -428,13 +429,13 @@ func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) {
428
429
// Generate codegen and codegenFrequencies, which indicates how to encode
429
430
// the literalEncoding and the offsetEncoding.
430
431
w .generateCodegen (numLiterals , numOffsets , w .literalEncoding , w .offsetEncoding )
431
- w .codegenEncoding .generate (w .codegenFreq , 7 )
432
+ w .codegenEncoding .generate (w .codegenFreq [:] , 7 )
432
433
numCodegens = len (w .codegenFreq )
433
434
for numCodegens > 4 && w .codegenFreq [codegenOrder [numCodegens - 1 ]] == 0 {
434
435
numCodegens --
435
436
}
436
437
dynamicHeader := int64 (3 + 5 + 5 + 4 + (3 * numCodegens )) +
437
- w .codegenEncoding .bitLength (w .codegenFreq ) +
438
+ w .codegenEncoding .bitLength (w .codegenFreq [:] ) +
438
439
int64 (extraBits ) +
439
440
int64 (w .codegenFreq [16 ]* 2 ) +
440
441
int64 (w .codegenFreq [17 ]* 3 ) +
@@ -482,7 +483,7 @@ func (w *huffmanBitWriter) writeBlockDynamic(tokens []token, eof bool, input []b
482
483
// Generate codegen and codegenFrequencies, which indicates how to encode
483
484
// the literalEncoding and the offsetEncoding.
484
485
w .generateCodegen (numLiterals , numOffsets , w .literalEncoding , w .offsetEncoding )
485
- w .codegenEncoding .generate (w .codegenFreq , 7 )
486
+ w .codegenEncoding .generate (w .codegenFreq [:] , 7 )
486
487
numCodegens := len (w .codegenFreq )
487
488
for numCodegens > 4 && w .codegenFreq [codegenOrder [numCodegens - 1 ]] == 0 {
488
489
numCodegens --
@@ -609,13 +610,13 @@ func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte) {
609
610
// Generate codegen and codegenFrequencies, which indicates how to encode
610
611
// the literalEncoding and the offsetEncoding.
611
612
w .generateCodegen (numLiterals , numOffsets , w .literalEncoding , huffOffset )
612
- w .codegenEncoding .generate (w .codegenFreq , 7 )
613
+ w .codegenEncoding .generate (w .codegenFreq [:] , 7 )
613
614
numCodegens = len (w .codegenFreq )
614
615
for numCodegens > 4 && w .codegenFreq [codegenOrder [numCodegens - 1 ]] == 0 {
615
616
numCodegens --
616
617
}
617
618
headerSize := int64 (3 + 5 + 5 + 4 + (3 * numCodegens )) +
618
- w .codegenEncoding .bitLength (w .codegenFreq ) +
619
+ w .codegenEncoding .bitLength (w .codegenFreq [:] ) +
619
620
int64 (w .codegenFreq [16 ]* 2 ) +
620
621
int64 (w .codegenFreq [17 ]* 3 ) +
621
622
int64 (w .codegenFreq [18 ]* 7 )
@@ -639,7 +640,7 @@ func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte) {
639
640
640
641
// Huffman.
641
642
w .writeDynamicHeader (numLiterals , numOffsets , numCodegens , eof )
642
- encoding := w .literalEncoding .codes
643
+ encoding := w .literalEncoding .codes [: 257 ]
643
644
n := w .nbytes
644
645
for _ , t := range input {
645
646
// Bitwriting inlined, ~30% speedup
@@ -653,12 +654,13 @@ func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte) {
653
654
bits := w .bits
654
655
w .bits >>= 48
655
656
w .nbits -= 48
656
- w .bytes [n + 0 ] = byte (bits )
657
- w .bytes [n + 1 ] = byte (bits >> 8 )
658
- w .bytes [n + 2 ] = byte (bits >> 16 )
659
- w .bytes [n + 3 ] = byte (bits >> 24 )
660
- w .bytes [n + 4 ] = byte (bits >> 32 )
661
- w .bytes [n + 5 ] = byte (bits >> 40 )
657
+ bytes := w .bytes [n : n + 6 ]
658
+ bytes [0 ] = byte (bits )
659
+ bytes [1 ] = byte (bits >> 8 )
660
+ bytes [2 ] = byte (bits >> 16 )
661
+ bytes [3 ] = byte (bits >> 24 )
662
+ bytes [4 ] = byte (bits >> 32 )
663
+ bytes [5 ] = byte (bits >> 40 )
662
664
n += 6
663
665
if n < bufferFlushSize {
664
666
continue
@@ -677,6 +679,7 @@ func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte) {
677
679
//
678
680
// len(h) must be >= 256, and h's elements must be all zeroes.
679
681
func histogram (b []byte , h []int32 ) {
682
+ h = h [:256 ]
680
683
for _ , t := range b {
681
684
h [t ]++
682
685
}
0 commit comments