cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

main
012 / internal / sheet / pivot_stress_test.go
pivot_stress_test.go 2.2K
1//go:build stress23package sheet_test45import (6 "testing"78 "src.rest/cat/012/internal/sheet"9 "src.rest/cat/012/internal/stress"10)1112// BenchmarkPivot is a pivot over a full 8192-row table recomputing after13// one edit to its source: the edit, the recalculation and the pivot's14// regrouping and rewriting of its results. The table's columns are an15// id, a category of 8, a number and one of 1000 items, twice.16func BenchmarkPivot(b *testing.B) {17 num := func(col int) sheet.PivotValue { return sheet.PivotValue{Col: col, Summarize: sheet.SumBy} }18 shapes := []struct {19 name string20 make func(src *sheet.Sheet, r sheet.Rect) sheet.Pivot21 }{22 {"rows-8", func(src *sheet.Sheet, r sheet.Rect) sheet.Pivot {23 p := sheet.NewPivot(src, r)24 p.Rows = []sheet.PivotGroup{{Col: 1}}25 p.Values = []sheet.PivotValue{num(2), {Col: 3, Summarize: sheet.CountABy}}26 return p27 }},28 {"rows-8x8-cols-8", func(src *sheet.Sheet, r sheet.Rect) sheet.Pivot {29 p := sheet.NewPivot(src, r)30 p.Rows = []sheet.PivotGroup{{Col: 1}, {Col: 5}}31 p.Columns = []sheet.PivotGroup{{Col: 5}}32 p.Values = []sheet.PivotValue{num(2), {Col: 6, Summarize: sheet.AverageBy}}33 return p34 }},35 {"rows-1000-unique", func(src *sheet.Sheet, r sheet.Rect) sheet.Pivot {36 p := sheet.NewPivot(src, r)37 p.Rows = []sheet.PivotGroup{{Col: 3, Desc: true, SortBy: 1}}38 p.Values = []sheet.PivotValue{num(2), {Col: 7, Summarize: sheet.CountUniqueBy}}39 return p40 }},41 {"frequency-1000", func(src *sheet.Sheet, r sheet.Rect) sheet.Pivot {42 return sheet.FrequencyPivot(src, r, 3)43 }},44 }45 for _, sh := range shapes {46 b.Run(sh.name, func(b *testing.B) {47 src := stress.Table(stress.Rows-1, 8)48 r := sheet.NewRect(sheet.Addr{}, sheet.Addr{Col: 7, Row: stress.Rows - 1})49 pv, err := src.Book().CreatePivot(src, r, "", sh.make(src, r))50 if err != nil {51 b.Fatal(err)52 }53 if pv.PivotError() != "" {54 b.Fatal(pv.PivotError())55 }56 edit := sheet.Addr{Col: 2, Row: 4000}57 inputs := [2]string{"1234.5", "4321.5"}58 i := 059 for b.Loop() {60 if err := src.Set(edit, inputs[i%2]); err != nil {61 b.Fatal(err)62 }63 i++64 }65 out, _ := pv.PivotRange()66 b.ReportMetric(float64(out.To.Row+1), "rows-out")67 })68 }69}