github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/asm/dot_inline_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 asm 13 14 import ( 15 "fmt" 16 "math/rand" 17 "testing" 18 ) 19 20 func dotLoop(x, y []float32) float32 { 21 var sum float32 22 for i := range x { 23 sum += x[i] * y[i] 24 } 25 26 return sum 27 } 28 29 func BenchmarkDotInlineVsLoop(b *testing.B) { 30 lengths := []int{2, 4, 6, 8, 10, 12} 31 for _, length := range lengths { 32 x := make([]float32, length) 33 y := make([]float32, length) 34 35 for i := range x { 36 x[i] = rand.Float32() 37 y[i] = rand.Float32() 38 } 39 40 b.Run(fmt.Sprintf("vector dim=%d", length), func(b *testing.B) { 41 b.Run("loop", func(b *testing.B) { 42 for i := 0; i < b.N; i++ { 43 dotLoop(x, y) 44 } 45 }) 46 47 b.Run("flat", func(b *testing.B) { 48 // written to ensure that the compiler 49 // inlines the function when possible 50 switch length { 51 case 2: 52 b.ResetTimer() 53 for i := 0; i < b.N; i++ { 54 dot2(x, y) 55 } 56 case 4: 57 b.ResetTimer() 58 for i := 0; i < b.N; i++ { 59 dot4(x, y) 60 } 61 case 6: 62 b.ResetTimer() 63 for i := 0; i < b.N; i++ { 64 dot6(x, y) 65 } 66 case 8: 67 b.ResetTimer() 68 for i := 0; i < b.N; i++ { 69 dot8(x, y) 70 } 71 case 10: 72 b.ResetTimer() 73 for i := 0; i < b.N; i++ { 74 dot10(x, y) 75 } 76 case 12: 77 b.ResetTimer() 78 for i := 0; i < b.N; i++ { 79 dot12(x, y) 80 } 81 default: 82 panic("unsupported length") 83 } 84 }) 85 }) 86 } 87 }