From ca0d3877523ca08f620c199428ddd018ba951491 Mon Sep 17 00:00:00 2001 From: Koichi Shiraishi Date: Thu, 6 Feb 2025 09:04:22 +0900 Subject: [PATCH] feat(z): use zeebo/xxh3 instead of cespare/xxhash/v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit goos: darwin goarch: amd64 pkg: github.com/dgraph-io/ristretto/v2/z cpu: Intel(R) Xeon(R) W-3245 CPU @ 3.20GHz │ old.txt │ new.txt │ │ sec/op │ sec/op vs base │ KeyToHashBytes/foo-32 9.588n ± 1% 8.166n ± 0% -14.82% (p=0.000 n=10) KeyToHashBytes/barbaz-32 9.643n ± 1% 8.556n ± 0% -11.27% (p=0.000 n=10) KeyToHashBytes/quxquuxquuz-32 10.495n ± 0% 8.242n ± 0% -21.47% (p=0.000 n=10) KeyToHashBytes/corgegraultgarplywaldo-32 11.435n ± 0% 9.403n ± 0% -17.77% (p=0.000 n=10) KeyToHashString/foo-32 9.851n ± 1% 7.814n ± 0% -20.68% (p=0.000 n=10) KeyToHashString/barbaz-32 9.917n ± 0% 7.911n ± 0% -20.23% (p=0.000 n=10) KeyToHashString/quxquuxquuz-32 11.135n ± 0% 7.917n ± 0% -28.90% (p=0.000 n=10) KeyToHashString/corgegraultgarplywaldo-32 12.475n ± 0% 8.805n ± 0% -29.42% (p=0.000 n=10) geomean 10.52n 8.337n -20.79% │ old.txt │ new.txt │ │ B/s │ B/s vs base │ KeyToHashBytes/foo-32 298.4Mi ± 1% 350.3Mi ± 0% +17.40% (p=0.000 n=10) KeyToHashBytes/barbaz-32 593.4Mi ± 1% 668.8Mi ± 0% +12.70% (p=0.000 n=10) KeyToHashBytes/quxquuxquuz-32 999.9Mi ± 0% 1272.8Mi ± 0% +27.30% (p=0.000 n=10) KeyToHashBytes/corgegraultgarplywaldo-32 1.792Gi ± 0% 2.179Gi ± 0% +21.60% (p=0.000 n=10) KeyToHashString/foo-32 290.4Mi ± 1% 366.1Mi ± 0% +26.07% (p=0.000 n=10) KeyToHashString/barbaz-32 577.0Mi ± 0% 723.3Mi ± 0% +25.37% (p=0.000 n=10) KeyToHashString/quxquuxquuz-32 942.5Mi ± 0% 1325.0Mi ± 0% +40.59% (p=0.000 n=10) KeyToHashString/corgegraultgarplywaldo-32 1.643Gi ± 0% 2.327Gi ± 0% +41.66% (p=0.000 n=10) geomean 736.2Mi 929.3Mi +26.23% │ old.txt │ new.txt │ │ B/op │ B/op vs base │ KeyToHashBytes/foo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashBytes/barbaz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashBytes/quxquuxquuz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashBytes/corgegraultgarplywaldo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/foo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/barbaz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/quxquuxquuz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/corgegraultgarplywaldo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ geomean ² +0.00% ² ¹ all samples are equal ² summaries must be >0 to compute geomean │ old.txt │ new.txt │ │ allocs/op │ allocs/op vs base │ KeyToHashBytes/foo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashBytes/barbaz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashBytes/quxquuxquuz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashBytes/corgegraultgarplywaldo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/foo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/barbaz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/quxquuxquuz-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ KeyToHashString/corgegraultgarplywaldo-32 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ geomean ² +0.00% ² ¹ all samples are equal ² summaries must be >0 to compute geomean Signed-off-by: Koichi Shiraishi --- go.mod | 3 ++- go.sum | 8 ++++++-- z/z.go | 6 +++--- z/z_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index a3c5c9ea..5821afc8 100644 --- a/go.mod +++ b/go.mod @@ -5,16 +5,17 @@ go 1.22.11 toolchain go1.23.5 require ( - github.com/cespare/xxhash/v2 v2.3.0 github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da github.com/dustin/go-humanize v1.0.1 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.10.0 + github.com/zeebo/xxh3 v1.0.3-0.20230502181907-7a4a65f1295e golang.org/x/sys v0.30.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 515fa483..606d6bef 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,21 @@ -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.3-0.20230502181907-7a4a65f1295e h1:WwGTO/6KCjWBrM77YIl/+8uC1XYVsegq3qVSxOIfmRs= +github.com/zeebo/xxh3 v1.0.3-0.20230502181907-7a4a65f1295e/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/z/z.go b/z/z.go index 4b5611eb..a08f59a0 100644 --- a/z/z.go +++ b/z/z.go @@ -9,7 +9,7 @@ import ( "context" "sync" - "github.com/cespare/xxhash/v2" + "github.com/zeebo/xxh3" ) type Key interface { @@ -29,9 +29,9 @@ func KeyToHash[K Key](key K) (uint64, uint64) { case uint64: return k, 0 case string: - return MemHashString(k), xxhash.Sum64String(k) + return MemHashString(k), xxh3.HashString(k) case []byte: - return MemHash(k), xxhash.Sum64(k) + return MemHash(k), xxh3.Hash(k) case byte: return uint64(k), 0 case int: diff --git a/z/z_test.go b/z/z_test.go index 57d3bba6..efab8a76 100644 --- a/z/z_test.go +++ b/z/z_test.go @@ -6,6 +6,7 @@ package z import ( + "fmt" "math" "testing" @@ -94,3 +95,44 @@ func TestZeroOut(t *testing.T) { ZeroOut(dst, 0, len(dst)) check(dst, 0x00) } + +func BenchmarkKeyToHashBytes(b *testing.B) { + bench := [][]byte{ + []byte("foo"), + []byte("barbaz"), + []byte("quxquuxquuz"), + []byte("corgegraultgarplywaldo"), + } + benchmarkKeyToHash(b, bench) +} + +func BenchmarkKeyToHashString(b *testing.B) { + bench := []string{ + "foo", + "barbaz", + "quxquuxquuz", + "corgegraultgarplywaldo", + } + benchmarkKeyToHash(b, bench) +} + +var key, conflict uint64 + +func benchmarkKeyToHash[T Key](b *testing.B, bench []T) { + for _, bb := range bench { + b.Run(fmt.Sprintf("%s", any(bb)), func(b *testing.B) { + switch bb := any(bb).(type) { + case []byte: + b.SetBytes(int64(len(bb))) + case string: + b.SetBytes(int64(len(bb))) + } + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + key, conflict = KeyToHash(bb) + } + }) + } +}