]> Cypherpunks repositories - gostls13.git/commitdiff
image/jpeg: small memory layout optimization for encoding.
authorNigel Tao <nigeltao@golang.org>
Wed, 18 May 2011 21:39:37 +0000 (14:39 -0700)
committerNigel Tao <nigeltao@golang.org>
Wed, 18 May 2011 21:39:37 +0000 (14:39 -0700)
Before:
jpeg.BenchmarkEncodeRGBOpaque ... 23.29 MB/s
jpeg.BenchmarkEncodeRGBOpaque ... 23.27 MB/s
jpeg.BenchmarkEncodeRGBOpaque ... 23.17 MB/s

After:
jpeg.BenchmarkEncodeRGBOpaque ... 23.42 MB/s
jpeg.BenchmarkEncodeRGBOpaque ... 23.34 MB/s
jpeg.BenchmarkEncodeRGBOpaque ... 23.33 MB/s

R=rsc
CC=golang-dev
https://golang.org/cl/4538077

src/pkg/image/jpeg/writer.go

index c23372f0ec5a6bb3763318ee78304c6c87070fcb..eddaaefb6ba929de3b78834a38245a1cfd0e6794 100644 (file)
@@ -221,8 +221,7 @@ type encoder struct {
        // buf is a scratch buffer.
        buf [16]byte
        // bits and nBits are accumulated bits to write to w.
-       bits  uint32
-       nBits uint8
+       bits, nBits uint32
        // quant is the scaled quantization tables.
        quant [nQuantIndex][blockSize]byte
 }
@@ -250,7 +249,7 @@ func (e *encoder) writeByte(b byte) {
 
 // emit emits the least significant nBits bits of bits to the bitstream.
 // The precondition is bits < 1<<nBits && nBits <= 16.
-func (e *encoder) emit(bits uint32, nBits uint8) {
+func (e *encoder) emit(bits, nBits uint32) {
        nBits += e.nBits
        bits <<= 32 - nBits
        bits |= e.bits
@@ -269,7 +268,7 @@ func (e *encoder) emit(bits uint32, nBits uint8) {
 // emitHuff emits the given value with the given Huffman encoder.
 func (e *encoder) emitHuff(h huffIndex, value int) {
        x := theHuffmanLUT[h][value]
-       e.emit(x&(1<<24-1), uint8(x>>24))
+       e.emit(x&(1<<24-1), x>>24)
 }
 
 // emitHuffRLE emits a run of runLength copies of value encoded with the given
@@ -279,11 +278,11 @@ func (e *encoder) emitHuffRLE(h huffIndex, runLength, value int) {
        if a < 0 {
                a, b = -value, value-1
        }
-       var nBits uint8
+       var nBits uint32
        if a < 0x100 {
-               nBits = bitCount[a]
+               nBits = uint32(bitCount[a])
        } else {
-               nBits = 8 + bitCount[a>>8]
+               nBits = 8 + uint32(bitCount[a>>8])
        }
        e.emitHuff(h, runLength<<4|int(nBits))
        if nBits > 0 {