aboutsummaryrefslogtreecommitdiff
path: root/src/bytes
diff options
context:
space:
mode:
authorUttam C Pawar <uttam.c.pawar@intel.com>2015-07-02 11:43:46 -0700
committerKeith Randall <khr@golang.org>2015-08-26 03:52:20 +0000
commit32add8d7c8433d87aca782ddcd79898922ac96b7 (patch)
treeb6761e5bcdf4f60ddb3668946877dc0be4928138 /src/bytes
parentabab21b1d1e9a33851b8b04e605f154d4198c2ee (diff)
downloadgo-32add8d7c8433d87aca782ddcd79898922ac96b7.tar.xz
bytes: improve Compare function on amd64 for large byte arrays
This patch contains only loop unrolling change for size > 63B Following are the performance numbers for various sizes on On Haswell based system: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz. benchcmp go.head.8.25.15.txt go.head.8.25.15.opt.txt benchmark old ns/op new ns/op delta BenchmarkBytesCompare1-4 5.37 5.37 +0.00% BenchmarkBytesCompare2-4 5.37 5.38 +0.19% BenchmarkBytesCompare4-4 5.37 5.37 +0.00% BenchmarkBytesCompare8-4 4.42 4.38 -0.90% BenchmarkBytesCompare16-4 4.27 4.45 +4.22% BenchmarkBytesCompare32-4 5.30 5.36 +1.13% BenchmarkBytesCompare64-4 6.93 6.78 -2.16% BenchmarkBytesCompare128-4 10.3 9.50 -7.77% BenchmarkBytesCompare256-4 17.1 13.8 -19.30% BenchmarkBytesCompare512-4 31.3 22.1 -29.39% BenchmarkBytesCompare1024-4 62.5 39.0 -37.60% BenchmarkBytesCompare2048-4 112 73.2 -34.64% Change-Id: I4eeb1c22732fd62cbac97ba757b0d29f648d4ef1 Reviewed-on: https://go-review.googlesource.com/11871 Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/bytes')
-rw-r--r--src/bytes/bytes_test.go31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go
index 6245e48180..8df62fcc6a 100644
--- a/src/bytes/bytes_test.go
+++ b/src/bytes/bytes_test.go
@@ -1255,3 +1255,34 @@ func BenchmarkRepeat(b *testing.B) {
Repeat([]byte("-"), 80)
}
}
+
+func benchmarkBytesCompare(b *testing.B, n int) {
+ var x = make([]byte, n)
+ var y = make([]byte, n)
+
+ for i := 0; i < n; i++ {
+ x[i] = 'a'
+ }
+
+ for i := 0; i < n; i++ {
+ y[i] = 'a'
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ Compare(x, y)
+ }
+}
+
+func BenchmarkBytesCompare1(b *testing.B) { benchmarkBytesCompare(b, 1) }
+func BenchmarkBytesCompare2(b *testing.B) { benchmarkBytesCompare(b, 2) }
+func BenchmarkBytesCompare4(b *testing.B) { benchmarkBytesCompare(b, 4) }
+func BenchmarkBytesCompare8(b *testing.B) { benchmarkBytesCompare(b, 8) }
+func BenchmarkBytesCompare16(b *testing.B) { benchmarkBytesCompare(b, 16) }
+func BenchmarkBytesCompare32(b *testing.B) { benchmarkBytesCompare(b, 32) }
+func BenchmarkBytesCompare64(b *testing.B) { benchmarkBytesCompare(b, 64) }
+func BenchmarkBytesCompare128(b *testing.B) { benchmarkBytesCompare(b, 128) }
+func BenchmarkBytesCompare256(b *testing.B) { benchmarkBytesCompare(b, 256) }
+func BenchmarkBytesCompare512(b *testing.B) { benchmarkBytesCompare(b, 512) }
+func BenchmarkBytesCompare1024(b *testing.B) { benchmarkBytesCompare(b, 1024) }
+func BenchmarkBytesCompare2048(b *testing.B) { benchmarkBytesCompare(b, 2048) }