• Nigel Tao's avatar
    image/jpeg: change block from [64]int to [64]int32. · daf43ba4
    Nigel Tao authored
    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
    daf43ba4
writer.go 14.8 KB