github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/bench_arm64_test.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package distancer 13 14 import ( 15 "fmt" 16 "testing" 17 18 "github.com/weaviate/weaviate/adapters/repos/db/vector/hnsw/distancer/asm" 19 ) 20 21 func benchmarkDotGo(b *testing.B, dims int) { 22 r := getRandomSeed() 23 24 vec1 := make([]float32, dims) 25 vec2 := make([]float32, dims) 26 for i := range vec1 { 27 vec1[i] = r.Float32() 28 vec2[i] = r.Float32() 29 } 30 31 b.ResetTimer() 32 for n := 0; n < b.N; n++ { 33 DotProductGo(vec1, vec2) 34 } 35 } 36 37 func benchmarkDotNeon(b *testing.B, dims int) { 38 r := getRandomSeed() 39 40 vec1 := make([]float32, dims) 41 vec2 := make([]float32, dims) 42 for i := range vec1 { 43 vec1[i] = r.Float32() 44 vec2[i] = r.Float32() 45 } 46 47 b.ResetTimer() 48 for n := 0; n < b.N; n++ { 49 asm.Dot(vec1, vec2) 50 } 51 } 52 53 func BenchmarkDot(b *testing.B) { 54 dims := []int{30, 32, 128, 256, 300, 384, 600, 768, 1024} 55 for _, dim := range dims { 56 b.Run(fmt.Sprintf("%d dimensions", dim), func(b *testing.B) { 57 b.Run("pure go", func(b *testing.B) { benchmarkDotGo(b, dim) }) 58 b.Run("avx", func(b *testing.B) { benchmarkDotNeon(b, dim) }) 59 }) 60 } 61 }