]> Cypherpunks repositories - gostls13.git/commit
image/draw, image/color: optimize hot path sqDiff function
authorArtyom Pervukhin <artyom.pervukhin@gmail.com>
Sun, 22 Oct 2017 10:33:06 +0000 (13:33 +0300)
committerNigel Tao <nigeltao@golang.org>
Fri, 27 Oct 2017 05:47:09 +0000 (05:47 +0000)
commit7a8e8b2f19c423b07a86adcd41b91575b7ecd875
tree3161cf2fc6ebfc31b0a6b84027f06a25d509fb91
parent6222997047dda627e9b65c880e772ac5042d62d8
image/draw, image/color: optimize hot path sqDiff function

Function sqDiff is called multiple times in the hot path (x, y loops) of
drawPaletted from the image/draw package; number of sqDiff calls is
between 4×width×height and 4×width×height×len(palette) for each
drawPaletted call.

Simplify this function by removing arguments comparison and relying
instead on signed to unsigned integer conversion rules and properties of
unsigned integer values operations guaranteed by the spec:

> For unsigned integer values, the operations +, -, *, and << are
> computed modulo 2n, where n is the bit width of the unsigned integer's
> type. Loosely speaking, these unsigned integer operations discard high
> bits upon overflow, and programs may rely on ``wrap around''.

image/gif package benchmark that depends on the code updated shows
throughput improvements:

name               old time/op    new time/op    delta
QuantizedEncode-4     788ms ± 2%     468ms ± 9%  -40.58%  (p=0.000 n=9+10)

name               old speed      new speed      delta
QuantizedEncode-4  1.56MB/s ± 2%  2.63MB/s ± 8%  +68.47%  (p=0.000 n=9+10)

Closes #22375.

Change-Id: Ic9a540e39ceb21e7741d308af1cfbe61b4ac347b
Reviewed-on: https://go-review.googlesource.com/72373
Reviewed-by: Nigel Tao <nigeltao@golang.org>
src/image/color/color.go
src/image/color/color_test.go [new file with mode: 0644]
src/image/draw/draw.go
src/image/draw/draw_test.go