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  }