mirror of
https://github.com/golang/go
synced 2024-11-22 21:50:03 -07:00
compress/flate: faster version of forwardCopy
benchmark old ns/op new ns/op delta
BenchmarkDecodeDigitsSpeed1e4 197767 203490 +2.89%
BenchmarkDecodeDigitsSpeed1e5 1873969 1912761 +2.07%
BenchmarkDecodeDigitsSpeed1e6 18922760 19021056 +0.52%
BenchmarkDecodeDigitsDefault1e4 194975 197054 +1.07%
BenchmarkDecodeDigitsDefault1e5 1704262 1719988
+0.92%
BenchmarkDecodeDigitsDefault1e6 16618354 16351957 -1.60%
BenchmarkDecodeDigitsCompress1e4 195281 194626 -0.34%
BenchmarkDecodeDigitsCompress1e5 1694364 1702372 +0.47%
BenchmarkDecodeDigitsCompress1e6 16463347 16492126 +0.17%
BenchmarkDecodeTwainSpeed1e4 200653 200127 -0.26%
BenchmarkDecodeTwainSpeed1e5 1861385 1759632 -5.47%
BenchmarkDecodeTwainSpeed1e6 18255769 17186679 -5.86%
BenchmarkDecodeTwainDefault1e4 189080 185157 -2.07%
BenchmarkDecodeTwainDefault1e5 1559222 1461465 -6.27%
BenchmarkDecodeTwainDefault1e6 14792125 13879051 -6.17%
BenchmarkDecodeTwainCompress1e4 188881 185151 -1.97%
BenchmarkDecodeTwainCompress1e5 1537031 1456945 -5.21%
BenchmarkDecodeTwainCompress1e6 14805972 13405094 -9.46%
BenchmarkPaeth 4 4 -0.89%
BenchmarkDecodeGray 964679 937244 -2.84%
BenchmarkDecodeNRGBAGradient 3753769 3646416 -2.86%
BenchmarkDecodeNRGBAOpaque 3165856 2981300 -5.83%
BenchmarkDecodePaletted 713950 691984 -3.08%
BenchmarkDecodeRGB 3051718 2924260 -4.18%
R=nigeltao, bradfitz
CC=golang-dev, raph
https://golang.org/cl/9425046
This commit is contained in:
parent
70f3b6097b
commit
28882bbd33
@ -6,12 +6,27 @@ package flate
|
|||||||
|
|
||||||
// forwardCopy is like the built-in copy function except that it always goes
|
// forwardCopy is like the built-in copy function except that it always goes
|
||||||
// forward from the start, even if the dst and src overlap.
|
// forward from the start, even if the dst and src overlap.
|
||||||
func forwardCopy(dst, src []byte) int {
|
// It is equivalent to:
|
||||||
if len(src) > len(dst) {
|
// for i := 0; i < n; i++ {
|
||||||
src = src[:len(dst)]
|
// mem[dst+i] = mem[src+i]
|
||||||
|
// }
|
||||||
|
func forwardCopy(mem []byte, dst, src, n int) {
|
||||||
|
if dst <= src {
|
||||||
|
copy(mem[dst:dst+n], mem[src:src+n])
|
||||||
|
return
|
||||||
}
|
}
|
||||||
for i, x := range src {
|
for {
|
||||||
dst[i] = x
|
if dst >= src+n {
|
||||||
|
copy(mem[dst:dst+n], mem[src:src+n])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// There is some forward overlap. The destination
|
||||||
|
// will be filled with a repeated pattern of mem[src:src+k].
|
||||||
|
// We copy one instance of the pattern here, then repeat.
|
||||||
|
// Each time around this loop k will double.
|
||||||
|
k := dst - src
|
||||||
|
copy(mem[dst:dst+k], mem[src:src+k])
|
||||||
|
n -= k
|
||||||
|
dst += k
|
||||||
}
|
}
|
||||||
return len(src)
|
|
||||||
}
|
}
|
||||||
|
@ -30,10 +30,12 @@ func TestForwardCopy(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
b := []byte("0123456789")
|
b := []byte("0123456789")
|
||||||
dst := b[tc.dst0:tc.dst1]
|
n := tc.dst1 - tc.dst0
|
||||||
src := b[tc.src0:tc.src1]
|
if tc.src1-tc.src0 < n {
|
||||||
n := forwardCopy(dst, src)
|
n = tc.src1 - tc.src0
|
||||||
got := string(dst[:n])
|
}
|
||||||
|
forwardCopy(b, tc.dst0, tc.src0, n)
|
||||||
|
got := string(b[tc.dst0 : tc.dst0+n])
|
||||||
if got != tc.want {
|
if got != tc.want {
|
||||||
t.Errorf("dst=b[%d:%d], src=b[%d:%d]: got %q, want %q",
|
t.Errorf("dst=b[%d:%d], src=b[%d:%d]: got %q, want %q",
|
||||||
tc.dst0, tc.dst1, tc.src0, tc.src1, got, tc.want)
|
tc.dst0, tc.dst1, tc.src0, tc.src1, got, tc.want)
|
||||||
|
@ -511,7 +511,7 @@ func (f *decompressor) copyHist() bool {
|
|||||||
if x := len(f.hist) - p; n > x {
|
if x := len(f.hist) - p; n > x {
|
||||||
n = x
|
n = x
|
||||||
}
|
}
|
||||||
forwardCopy(f.hist[f.hp:f.hp+n], f.hist[p:p+n])
|
forwardCopy(f.hist[:], f.hp, p, n)
|
||||||
p += n
|
p += n
|
||||||
f.hp += n
|
f.hp += n
|
||||||
f.copyLen -= n
|
f.copyLen -= n
|
||||||
|
Loading…
Reference in New Issue
Block a user