mirror of https://github.com/golang/go.git
image/jpeg: don't call ensureNBits unless we have to.
benchmark old ns/op new ns/op delta BenchmarkDecodeBaseline 3155638 2783998 -11.78% BenchmarkDecodeProgressive 4008088 3660310 -8.68% R=r, bradfitz CC=golang-dev https://golang.org/cl/6775072
This commit is contained in:
parent
d12a7d39d1
commit
ad487dad75
|
|
@ -62,10 +62,11 @@ func (d *decoder) ensureNBits(n int) error {
|
||||||
|
|
||||||
// The composition of RECEIVE and EXTEND, specified in section F.2.2.1.
|
// The composition of RECEIVE and EXTEND, specified in section F.2.2.1.
|
||||||
func (d *decoder) receiveExtend(t uint8) (int32, error) {
|
func (d *decoder) receiveExtend(t uint8) (int32, error) {
|
||||||
err := d.ensureNBits(int(t))
|
if d.b.n < int(t) {
|
||||||
if err != nil {
|
if err := d.ensureNBits(int(t)); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
d.b.n -= int(t)
|
d.b.n -= int(t)
|
||||||
d.b.m >>= t
|
d.b.m >>= t
|
||||||
s := int32(1) << t
|
s := int32(1) << t
|
||||||
|
|
@ -168,10 +169,11 @@ func (d *decoder) decodeHuffman(h *huffman) (uint8, error) {
|
||||||
return 0, FormatError("uninitialized Huffman table")
|
return 0, FormatError("uninitialized Huffman table")
|
||||||
}
|
}
|
||||||
for i, code := 0, 0; i < maxCodeLength; i++ {
|
for i, code := 0, 0; i < maxCodeLength; i++ {
|
||||||
err := d.ensureNBits(1)
|
if d.b.n == 0 {
|
||||||
if err != nil {
|
if err := d.ensureNBits(1); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if d.b.a&d.b.m != 0 {
|
if d.b.a&d.b.m != 0 {
|
||||||
code |= 1
|
code |= 1
|
||||||
}
|
}
|
||||||
|
|
@ -187,8 +189,7 @@ func (d *decoder) decodeHuffman(h *huffman) (uint8, error) {
|
||||||
|
|
||||||
func (d *decoder) decodeBit() (bool, error) {
|
func (d *decoder) decodeBit() (bool, error) {
|
||||||
if d.b.n == 0 {
|
if d.b.n == 0 {
|
||||||
err := d.ensureNBits(1)
|
if err := d.ensureNBits(1); err != nil {
|
||||||
if err != nil {
|
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -199,10 +200,11 @@ func (d *decoder) decodeBit() (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) decodeBits(n int) (uint32, error) {
|
func (d *decoder) decodeBits(n int) (uint32, error) {
|
||||||
err := d.ensureNBits(n)
|
if d.b.n < n {
|
||||||
if err != nil {
|
if err := d.ensureNBits(n); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ret := d.b.a >> uint(d.b.n-n)
|
ret := d.b.a >> uint(d.b.n-n)
|
||||||
ret &= (1 << uint(n)) - 1
|
ret &= (1 << uint(n)) - 1
|
||||||
d.b.n -= n
|
d.b.n -= n
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue