From 31da093c1e8b82bcba42846a4a8f670452df88f3 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 16 Apr 2016 18:36:07 -0700 Subject: [PATCH] image/draw: remove some bounds checks from DrawYCbCr MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It’d be nicer to write just _ = dpix[x+3] but the compiler isn’t able to reason about offsets from symbols (yet). image/draw benchmark: YCbCr-8 722µs ± 3% 682µs ± 3% -5.54% (p=0.000 n=50+50) Change-Id: Ia1e399496ed87c282bf0f9ca56c0b2d4948a0df9 Reviewed-on: https://go-review.googlesource.com/22146 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/image/internal/imageutil/gen.go | 11 +++++--- src/image/internal/imageutil/impl.go | 40 +++++++++++++++++----------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/image/internal/imageutil/gen.go b/src/image/internal/imageutil/gen.go index b9158d0ce9..6792b28a45 100644 --- a/src/image/internal/imageutil/gen.go +++ b/src/image/internal/imageutil/gen.go @@ -133,10 +133,13 @@ const sratioCase = ` b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } } ` diff --git a/src/image/internal/imageutil/impl.go b/src/image/internal/imageutil/impl.go index 39b455fdfa..3696b08e41 100644 --- a/src/image/internal/imageutil/impl.go +++ b/src/image/internal/imageutil/impl.go @@ -82,10 +82,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } } @@ -137,10 +139,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } } @@ -192,10 +196,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } } @@ -246,10 +252,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } } -- 2.48.1