1
0
mirror of https://github.com/golang/go synced 2024-11-25 02:07:58 -07:00

Optimize exp/draw/x11 flusher inner loop.

On my laptop, time to prepare and write 800x600 pixels over the
socket falls from 125-ish ms to 80-ish ms.

Thanks to Roger Peppe for the suggestion.

R=r
CC=golang-dev
https://golang.org/cl/1228044
This commit is contained in:
Nigel Tao 2010-05-24 19:32:42 -07:00
parent 6a060200cc
commit 0c662f60a5

View File

@ -91,18 +91,18 @@ func (c *conn) flusher() {
close(c.flush) close(c.flush)
return return
} }
p := c.img.Pixel[y]
for x := 0; x < w; { for x := 0; x < w; {
nx := w - x nx := w - x
if nx > len(c.flushBuf1)/4 { if nx > len(c.flushBuf1)/4 {
nx = len(c.flushBuf1) / 4 nx = len(c.flushBuf1) / 4
} }
for i := 0; i < nx; i++ { for i, rgba := range p[x : x+nx] {
r, g, b, _ := c.img.At(x, y).RGBA() c.flushBuf1[4*i+0] = rgba.B
c.flushBuf1[4*i+0] = uint8(b >> 24) c.flushBuf1[4*i+1] = rgba.G
c.flushBuf1[4*i+1] = uint8(g >> 24) c.flushBuf1[4*i+2] = rgba.R
c.flushBuf1[4*i+2] = uint8(r >> 24)
x++
} }
x += nx
_, err := c.w.Write(c.flushBuf1[0 : 4*nx]) _, err := c.w.Write(c.flushBuf1[0 : 4*nx])
if err != nil { if err != nil {
close(c.flush) close(c.flush)