From 32add8d7c8433d87aca782ddcd79898922ac96b7 Mon Sep 17 00:00:00 2001 From: Uttam C Pawar Date: Thu, 2 Jul 2015 11:43:46 -0700 Subject: 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 --- src/bytes/bytes_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/bytes/bytes_test.go') 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) } -- cgit v1.3-5-g9baa