mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
75eeea21ee
While at it, slightly increase the conversion performance by moving fast path to the top of the loop.
130 lines
2.8 KiB
Go
130 lines
2.8 KiB
Go
package decimal
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"sync/atomic"
|
|
"testing"
|
|
)
|
|
|
|
func BenchmarkAppendDecimalToFloat(b *testing.B) {
|
|
b.Run("RealFloat", func(b *testing.B) {
|
|
benchmarkAppendDecimalToFloat(b, testVA)
|
|
})
|
|
b.Run("Integers", func(b *testing.B) {
|
|
benchmarkAppendDecimalToFloat(b, testIntegers)
|
|
})
|
|
b.Run("Zeros", func(b *testing.B) {
|
|
benchmarkAppendDecimalToFloat(b, testZeros)
|
|
})
|
|
b.Run("Ones", func(b *testing.B) {
|
|
benchmarkAppendDecimalToFloat(b, testOnes)
|
|
})
|
|
}
|
|
|
|
func benchmarkAppendDecimalToFloat(b *testing.B, a []int64) {
|
|
b.ReportAllocs()
|
|
b.SetBytes(int64(len(a)))
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
var fa []float64
|
|
for pb.Next() {
|
|
fa = AppendDecimalToFloat(fa[:0], a, 0)
|
|
atomic.AddUint64(&Sink, uint64(len(fa)))
|
|
}
|
|
})
|
|
}
|
|
|
|
var testZeros = make([]int64, 8*1024)
|
|
var testOnes = func() []int64 {
|
|
a := make([]int64, 8*1024)
|
|
for i := 0; i < len(a); i++ {
|
|
a[i] = 1
|
|
}
|
|
return a
|
|
}()
|
|
|
|
func BenchmarkAppendFloatToDecimal(b *testing.B) {
|
|
b.Run("RealFloat", func(b *testing.B) {
|
|
benchmarkAppendFloatToDecimal(b, testFAReal)
|
|
})
|
|
b.Run("Integers", func(b *testing.B) {
|
|
benchmarkAppendFloatToDecimal(b, testFAInteger)
|
|
})
|
|
b.Run("Zeros", func(b *testing.B) {
|
|
benchmarkAppendFloatToDecimal(b, testFZeros)
|
|
})
|
|
b.Run("Ones", func(b *testing.B) {
|
|
benchmarkAppendFloatToDecimal(b, testFOnes)
|
|
})
|
|
}
|
|
|
|
var testFZeros = make([]float64, 8*1024)
|
|
var testFOnes = func() []float64 {
|
|
a := make([]float64, 8*1024)
|
|
for i := 0; i < len(a); i++ {
|
|
a[i] = 1
|
|
}
|
|
return a
|
|
}()
|
|
|
|
func benchmarkAppendFloatToDecimal(b *testing.B, fa []float64) {
|
|
b.ReportAllocs()
|
|
b.SetBytes(int64(len(fa)))
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
var da []int64
|
|
var e int16
|
|
var sink uint64
|
|
for pb.Next() {
|
|
da, e = AppendFloatToDecimal(da[:0], fa)
|
|
sink += uint64(len(da))
|
|
sink += uint64(e)
|
|
}
|
|
atomic.AddUint64(&Sink, sink)
|
|
})
|
|
}
|
|
|
|
var testFAReal = func() []float64 {
|
|
fa := make([]float64, 8*1024)
|
|
for i := 0; i < len(fa); i++ {
|
|
fa[i] = rand.NormFloat64() * 1e-6
|
|
}
|
|
return fa
|
|
}()
|
|
|
|
var testFAInteger = func() []float64 {
|
|
fa := make([]float64, 8*1024)
|
|
for i := 0; i < len(fa); i++ {
|
|
fa[i] = float64(int(rand.NormFloat64() * 1e6))
|
|
}
|
|
return fa
|
|
}()
|
|
|
|
var testVA = func() []int64 {
|
|
va, _ := AppendFloatToDecimal(nil, testFAReal)
|
|
return va
|
|
}()
|
|
|
|
var testIntegers = func() []int64 {
|
|
va, _ := AppendFloatToDecimal(nil, testFAInteger)
|
|
return va
|
|
}()
|
|
|
|
func BenchmarkFromFloat(b *testing.B) {
|
|
for _, f := range []float64{0, 1234, 12334345, 12343.4344, 123.45678901e12, 12.3454435e30} {
|
|
b.Run(fmt.Sprintf("%g", f), func(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.SetBytes(1)
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
var sink uint64
|
|
for pb.Next() {
|
|
v, e := FromFloat(f)
|
|
sink += uint64(v)
|
|
sink += uint64(e)
|
|
}
|
|
atomic.AddUint64(&Sink, sink)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
var Sink uint64
|