package main

import (
        "fmt"
        "github.com/rcrowley/go-metrics"
        //      "log"
        "math"
        //      "os"
        "sync"
        "time"
)

func doCpuWork(cpuSize int, count int) time.Duration {
        var wg sync.WaitGroup
        start := time.Now()
        tmp := 0.0
        for c := 0; c < cpuSize; c++ {
                wg.Add(1)
                go func() {
                        for i := 0; i < count; i++ {
                                tmp = math.Sqrt(float64(i))
                        }
                        wg.Done()
                }()
        }
        wg.Wait()
        elapsed := time.Since(start)
        //      fmt.Println("execute time: ", elapsed)
        return elapsed
}

func main() {
        s := metrics.NewExpDecaySample(1028, 0.015)
        h := metrics.NewHistogram(s)
        metrics.Register("baz", h)
        for i := 0; i < 200; i++ {
                rt := doCpuWork(4, 20000000)
                h.Update(int64(rt))
                //              time.Sleep(time.Duration(10) * time.Millisecond)
        }
        ps := h.Percentiles([]float64{0.5, 0.90, 0.95, 0.99})
        fmt.Println("quantile 0.5: ", ps[0], "ns")
        fmt.Println("quantile 0.90: ", ps[1], "ns")
        fmt.Println("quantile 0.95: ", ps[2], "ns")
        fmt.Println("quantile 0.99: ", ps[3], "ns")
}
