]> Cypherpunks repositories - gostls13.git/commit
image/jpeg: change block from [64]int to [64]int32.
authorNigel Tao <nigeltao@golang.org>
Tue, 30 Oct 2012 00:10:08 +0000 (11:10 +1100)
committerNigel Tao <nigeltao@golang.org>
Tue, 30 Oct 2012 00:10:08 +0000 (11:10 +1100)
commitdaf43ba476ac29c9c15b59169a9458900efa0e1d
tree4ef27b47e8e13a76f7135a1606dcd16dad63f0b8
parent9c775353b9f3fe2938afdc50ecd16277619f1119
image/jpeg: change block from [64]int to [64]int32.

On 6g/linux:
benchmark                     old ns/op    new ns/op    delta
BenchmarkFDCT                      4606         4241   -7.92%
BenchmarkIDCT                      4187         3923   -6.31%
BenchmarkDecodeBaseline         3154864      3170224   +0.49%
BenchmarkDecodeProgressive      4072812      4017132   -1.37%
BenchmarkEncode                39406920     34596760  -12.21%

Stack requirements before (from 'go tool 6g -S'):
(scan.go:37) TEXT    (*decoder).processSOS+0(SB),$1352-32
(writer.go:448) TEXT    (*encoder).writeSOS+0(SB),$5344-24

after:
(scan.go:37) TEXT    (*decoder).processSOS+0(SB),$1064-32
(writer.go:448) TEXT    (*encoder).writeSOS+0(SB),$2520-24

Also, in encoder.writeSOS, re-use the yBlock scratch buffer for Cb and
Cr. This reduces the stack requirement slightly, but also avoids an
unlucky coincidence where a BenchmarkEncode stack split lands between
encoder.writeByte and bufio.Writer.WriteByte, which occurs very often
during Huffman encoding and is otherwise disasterous for the final
benchmark number. FWIW, the yBlock re-use *without* the s/int/int32/
change does not have a noticable effect on the benchmarks.

R=r
CC=golang-dev, rsc
https://golang.org/cl/6823043
src/pkg/image/jpeg/dct_test.go
src/pkg/image/jpeg/huffman.go
src/pkg/image/jpeg/idct.go
src/pkg/image/jpeg/reader.go
src/pkg/image/jpeg/scan.go
src/pkg/image/jpeg/writer.go