diff options
| author | Josselin Costanzi <josselin@costanzi.fr> | 2017-03-27 13:22:59 +0200 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2017-04-07 14:25:13 +0000 |
| commit | d206af1e6c53df0c59d9466fe9c50415f9d8dcd5 (patch) | |
| tree | 32c3a797bfc7084deb8bbbe22edc034d5e6808e3 /src/bytes/bytes_amd64.go | |
| parent | 03d1aa602470a38510e0bd71341ed7b7a1672bc9 (diff) | |
| download | go-d206af1e6c53df0c59d9466fe9c50415f9d8dcd5.tar.xz | |
strings: optimize Count for amd64
Move optimized Count implementation from bytes to runtime. Use in
both bytes and strings packages.
Add CountByte benchmark to strings.
Strings benchmarks:
name old time/op new time/op delta
CountHard1-4 226µs ± 1% 226µs ± 2% ~ (p=0.247 n=10+10)
CountHard2-4 316µs ± 1% 315µs ± 0% ~ (p=0.133 n=9+10)
CountHard3-4 919µs ± 1% 920µs ± 1% ~ (p=0.968 n=10+9)
CountTorture-4 15.4µs ± 1% 15.7µs ± 1% +2.47% (p=0.000 n=10+9)
CountTortureOverlapping-4 9.60ms ± 0% 9.65ms ± 1% ~ (p=0.247 n=10+10)
CountByte/10-4 26.3ns ± 1% 10.9ns ± 1% -58.71% (p=0.000 n=9+9)
CountByte/32-4 42.7ns ± 0% 14.2ns ± 0% -66.64% (p=0.000 n=10+10)
CountByte/4096-4 3.07µs ± 0% 0.31µs ± 2% -89.99% (p=0.000 n=9+10)
CountByte/4194304-4 3.48ms ± 1% 0.34ms ± 1% -90.09% (p=0.000 n=10+9)
CountByte/67108864-4 55.6ms ± 1% 7.0ms ± 0% -87.49% (p=0.000 n=9+8)
name old speed new speed delta
CountByte/10-4 380MB/s ± 1% 919MB/s ± 1% +142.21% (p=0.000 n=9+9)
CountByte/32-4 750MB/s ± 0% 2247MB/s ± 0% +199.62% (p=0.000 n=10+10)
CountByte/4096-4 1.33GB/s ± 0% 13.32GB/s ± 2% +898.13% (p=0.000 n=9+10)
CountByte/4194304-4 1.21GB/s ± 1% 12.17GB/s ± 1% +908.87% (p=0.000 n=10+9)
CountByte/67108864-4 1.21GB/s ± 1% 9.65GB/s ± 0% +699.29% (p=0.000 n=9+8)
Fixes #19411
Change-Id: I8d2d409f0fa6df6d03b60790aa86e540b4a4e3b0
Reviewed-on: https://go-review.googlesource.com/38693
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/bytes/bytes_amd64.go')
| -rw-r--r-- | src/bytes/bytes_amd64.go | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/src/bytes/bytes_amd64.go b/src/bytes/bytes_amd64.go index ac9c002d6d..e68a3920d0 100644 --- a/src/bytes/bytes_amd64.go +++ b/src/bytes/bytes_amd64.go @@ -8,9 +8,10 @@ package bytes // indexShortStr returns the index of the first instance of c in s, or -1 if c is not present in s. // indexShortStr requires 2 <= len(c) <= shortStringLen -func indexShortStr(s, c []byte) int // ../runtime/asm_$GOARCH.s -func supportAVX2() bool // ../runtime/asm_$GOARCH.s -func supportPOPCNT() bool // ../runtime/asm_$GOARCH.s +func indexShortStr(s, c []byte) int // ../runtime/asm_$GOARCH.s +func supportAVX2() bool // ../runtime/asm_$GOARCH.s +func supportPOPCNT() bool // ../runtime/asm_$GOARCH.s +func countByte(s []byte, c byte) int // ../runtime/asm_$GOARCH.s var shortStringLen int @@ -95,9 +96,6 @@ func Index(s, sep []byte) int { return -1 } -// Special case for when we must count occurrences of a single byte. -func countByte(s []byte, c byte) int - // Count counts the number of non-overlapping instances of sep in s. // If sep is an empty slice, Count returns 1 + the number of Unicode code points in s. func Count(s, sep []byte) int { |
