mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-12 15:51:01 +00:00
Merge pull request #1820 from seebs/seebs/setvaluebenchmarks
setValue test and benchmark updates
This commit is contained in:
commit
63255315b1
1 changed files with 79 additions and 0 deletions
|
|
@ -367,6 +367,20 @@ func TestFragment_Sum(t *testing.T) {
|
|||
t.Fatalf("unexpected sum: %d", sum)
|
||||
}
|
||||
})
|
||||
|
||||
// verify that clearValue clears values
|
||||
if _, err := f.clearValue(1000, bitDepth, 23); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Run("ClearValue", func(t *testing.T) {
|
||||
if sum, n, err := f.sum(nil, bitDepth); err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n != 3 {
|
||||
t.Fatalf("unexpected count: %d", n)
|
||||
} else if sum != (3800 - 382) {
|
||||
t.Fatalf("unexpected sum: got %d, expecting %d", sum, 3800-382)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Ensure a fragment can find the min and max of values.
|
||||
|
|
@ -637,6 +651,71 @@ func TestFragment_Range(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
// benchmarkSetValues is a helper function to explore, very roughly, the cost
|
||||
// of setting values.
|
||||
func benchmarkSetValues(b *testing.B, bitDepth uint, f *fragment, cfunc func(uint64) uint64) {
|
||||
column := uint64(0)
|
||||
for i := 0; i < b.N; i++ {
|
||||
f.setValue(column, bitDepth, uint64(i))
|
||||
column = cfunc(column)
|
||||
}
|
||||
}
|
||||
|
||||
// Benchmark performance of setValue for BSI ranges.
|
||||
func BenchmarkFragment_SetValue(b *testing.B) {
|
||||
depths := []uint{4, 8, 16}
|
||||
for _, bitDepth := range depths {
|
||||
name := fmt.Sprintf("Depth%d", bitDepth)
|
||||
f := mustOpenFragment("i", "f", viewBSIGroupPrefix+"foo", 0, "none")
|
||||
b.Run(name+"_Sparse", func(b *testing.B) {
|
||||
benchmarkSetValues(b, bitDepth, f, func(u uint64) uint64 { return (u + 70000) & (ShardWidth - 1) })
|
||||
})
|
||||
f.Clean(b)
|
||||
f = mustOpenFragment("i", "f", viewBSIGroupPrefix+"foo", 0, "none")
|
||||
b.Run(name+"_Dense", func(b *testing.B) {
|
||||
benchmarkSetValues(b, bitDepth, f, func(u uint64) uint64 { return (u + 1) & (ShardWidth - 1) })
|
||||
})
|
||||
f.Clean(b)
|
||||
}
|
||||
}
|
||||
|
||||
// benchmarkImportValues is a helper function to explore, very roughly, the cost
|
||||
// of setting values using the special setter used for imports.
|
||||
func benchmarkImportValues(b *testing.B, bitDepth uint, f *fragment, cfunc func(uint64) uint64) {
|
||||
column := uint64(0)
|
||||
b.StopTimer()
|
||||
columns := make([]uint64, b.N)
|
||||
values := make([]uint64, b.N)
|
||||
for i := 0; i < b.N; i++ {
|
||||
values[i] = uint64(i)
|
||||
columns[i] = column
|
||||
column = cfunc(column)
|
||||
}
|
||||
b.StartTimer()
|
||||
err := f.importValue(columns, values, bitDepth, false)
|
||||
if err != nil {
|
||||
b.Fatalf("error importing values: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Benchmark performance of setValue for BSI ranges.
|
||||
func BenchmarkFragment_ImportValue(b *testing.B) {
|
||||
depths := []uint{4, 8, 16}
|
||||
for _, bitDepth := range depths {
|
||||
name := fmt.Sprintf("Depth%d", bitDepth)
|
||||
f := mustOpenFragment("i", "f", viewBSIGroupPrefix+"foo", 0, "none")
|
||||
b.Run(name+"_Sparse", func(b *testing.B) {
|
||||
benchmarkImportValues(b, bitDepth, f, func(u uint64) uint64 { return (u + 70000) & (ShardWidth - 1) })
|
||||
})
|
||||
f.Clean(b)
|
||||
f = mustOpenFragment("i", "f", viewBSIGroupPrefix+"foo", 0, "none")
|
||||
b.Run(name+"_Dense", func(b *testing.B) {
|
||||
benchmarkImportValues(b, bitDepth, f, func(u uint64) uint64 { return (u + 1) & (ShardWidth - 1) })
|
||||
})
|
||||
f.Clean(b)
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure a fragment can snapshot correctly.
|
||||
func TestFragment_Snapshot(t *testing.T) {
|
||||
f := mustOpenFragment("i", "f", viewStandard, 0, "")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue