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