github.com/loov/combiner@v0.1.0/extcombiner/latency_plot.go (about) 1 // +build ignore 2 3 package main 4 5 import ( 6 "bufio" 7 "compress/zlib" 8 "encoding/gob" 9 "fmt" 10 "image/color" 11 "io/ioutil" 12 "log" 13 "os" 14 "sort" 15 "strconv" 16 "time" 17 18 "github.com/loov/combiner/testsuite" 19 "github.com/loov/plot" 20 ) 21 22 func main() { 23 outputfile, err := os.Open("latency.zgob") 24 if err != nil { 25 log.Fatal(err) 26 } 27 defer outputfile.Close() 28 29 bufferedfile := bufio.NewReader(outputfile) 30 31 decompressor, _ := zlib.NewReader(bufferedfile) 32 defer decompressor.Close() 33 34 dec := gob.NewDecoder(decompressor) 35 36 type Result struct { 37 testsuite.Setup 38 Results [][]time.Duration 39 } 40 results := make([]Result, 0, 1000) 41 42 for { 43 var r Result 44 if err := dec.Decode(&r.Setup); err != nil { 45 log.Println(err) 46 break 47 } 48 if err := dec.Decode(&r.Results); err != nil { 49 log.Println(err) 50 break 51 } 52 53 results = append(results, r) 54 } 55 56 p := plot.New() 57 plotStack := plot.NewVStack() 58 plotStack.Margin = plot.R(0, 5, 0, 5) 59 p.Add(plotStack) 60 61 rowCount := 0.0 62 colCount := 4.0 63 64 axisGroups := map[int]*plot.AxisGroup{} 65 66 var procStack *plot.HStack 67 var axisGlobal *plot.AxisGroup 68 var procGroup *plot.AxisGroup 69 70 var previous Result 71 72 p.X.Transform = plot.NewPercentileTransform(5) 73 p.X.Ticks = plot.ManualTicks{ 74 {Value: 0, Label: "0"}, 75 {Value: 0.25, Label: "25"}, 76 {Value: 0.5, Label: "50"}, 77 {Value: 0.75, Label: "75"}, 78 {Value: 0.9, Label: "90"}, 79 {Value: 0.99, Label: "99"}, 80 {Value: 0.999, Label: "99.9"}, 81 {Value: 0.9999, Label: "99.99"}, 82 } 83 84 sort.SliceStable(results, func(i, k int) bool { 85 return results[i].Bounds < results[k].Bounds 86 }) 87 88 for _, result := range results { 89 if procStack == nil || result.Name != previous.Name || result.Bounds != previous.Bounds { 90 nameStack := plot.NewHFlex() 91 plotStack.Add(nameStack) 92 93 procStack = plot.NewHStack() 94 nameStack.Add(100, plot.NewTextbox(result.Name+":"+strconv.Itoa(result.Bounds))) 95 nameStack.Add(0, procStack) 96 97 procStack.Margin = plot.R(5, 0, 5, 0) 98 rowCount++ 99 } 100 101 if procGroup == nil || result.Procs != previous.Procs { 102 if procGroup != nil { 103 procGroup.Add(plot.NewTickLabels()) 104 procGroup.Add(plot.NewXLabel("P" + strconv.Itoa(previous.Procs))) 105 procGroup.Update() 106 } 107 108 var ok bool 109 axisGlobal, ok = axisGroups[result.Procs] 110 if !ok { 111 axisGlobal = plot.NewAxisGroup() 112 axisGlobal.X = p.X 113 axisGroups[result.Procs] = axisGlobal 114 } 115 116 procGroup = plot.NewAxisGroup() 117 procGroup.X = p.X 118 // procGroup.Y = axisGlobal.Y 119 120 procStack.Add(procGroup) 121 122 procGroup.Add(plot.NewGrid()) 123 } 124 if result.WorkStart == 100 && result.WorkDo == 0 && result.WorkFinish == 100 { 125 all := []float64{} 126 127 total := 0.0 128 for _, r := range result.Results { 129 rf := plot.DurationToNanoseconds(r) 130 for i := range rf { 131 total += rf[i] 132 } 133 all = append(all, rf...) 134 } 135 sort.Float64s(all) 136 p := int(0.999 * float64(len(all))) 137 fmt.Println(result.FullName(""), all[p]) 138 139 line := plot.NewPercentiles("", all) 140 line.Stroke = color.NRGBA{0, 0, 0, 255} 141 procGroup.Add(line) 142 axisGlobal.Add(line) 143 } 144 previous = result 145 } 146 147 if procGroup != nil { 148 procGroup.Add(plot.NewTickLabels()) 149 procGroup.Add(plot.NewXLabel("P" + strconv.Itoa(previous.Procs))) 150 procGroup.Update() 151 } 152 153 for _, axisGroup := range axisGroups { 154 axisGroup.Update() 155 } 156 157 svg := plot.NewSVG(150+400*colCount, 150*rowCount) 158 p.Draw(svg) 159 ioutil.WriteFile("latency.svg", svg.Bytes(), 0755) 160 }