forked from HdrHistogram/hdrhistogram-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
example_hdr_test.go
114 lines (97 loc) · 3.67 KB
/
example_hdr_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package hdrhistogram_test
import (
"fmt"
"github.com/HdrHistogram/hdrhistogram-go"
"os"
)
// This latency Histogram could be used to track and analyze the counts of
// observed integer values between 1 us and 30000000 us ( 30 secs )
// while maintaining a value precision of 4 significant digits across that range,
// translating to a value resolution of :
// - 1 microsecond up to 10 milliseconds,
// - 100 microsecond (or better) from 10 milliseconds up to 10 seconds,
// - 300 microsecond (or better) from 10 seconds up to 30 seconds,
// nolint
func ExampleNew() {
lH := hdrhistogram.New(1, 30000000, 4)
input := []int64{
459876, 669187, 711612, 816326, 931423, 1033197, 1131895, 2477317,
3964974, 12718782,
}
for _, sample := range input {
lH.RecordValue(sample)
}
fmt.Printf("Percentile 50: %d\n", lH.ValueAtQuantile(50.0))
// Output:
// Percentile 50: 931423
}
// This latency Histogram could be used to track and analyze the counts of
// observed integer values between 0 us and 30000000 us ( 30 secs )
// while maintaining a value precision of 3 significant digits across that range,
// translating to a value resolution of :
// - 1 microsecond up to 1 millisecond,
// - 1 millisecond (or better) up to one second,
// - 1 second (or better) up to it's maximum tracked value ( 30 seconds ).
// nolint
func ExampleHistogram_RecordValue() {
lH := hdrhistogram.New(1, 30000000, 3)
input := []int64{
459876, 669187, 711612, 816326, 931423, 1033197, 1131895, 2477317,
3964974, 12718782,
}
for _, sample := range input {
lH.RecordValue(sample)
}
fmt.Printf("Percentile 50: %d\n", lH.ValueAtQuantile(50.0))
// Output:
// Percentile 50: 931839
}
// The following example details the creation of an histogram used to track
// and analyze the counts of observed integer values between 0 us and 30000000 us ( 30 secs )
// and the printing of the percentile output format
// nolint
func ExampleHistogram_PercentilesPrint() {
lH := hdrhistogram.New(1, 30000000, 3)
input := []int64{
459876, 669187, 711612, 816326, 931423, 1033197, 1131895, 2477317,
3964974, 12718782,
}
for _, sample := range input {
lH.RecordValue(sample)
}
lH.PercentilesPrint(os.Stdout, 1, 1.0)
// Output:
// Value Percentile TotalCount 1/(1-Percentile)
//
// 460031.000 0.000000 1 1.00
// 931839.000 0.500000 5 2.00
// 2478079.000 0.750000 8 4.00
// 3966975.000 0.875000 9 8.00
// 12722175.000 0.937500 10 16.00
// 12722175.000 1.000000 10 inf
// #[Mean = 2491481.600, StdDeviation = 3557920.109]
// #[Max = 12722175.000, Total count = 10]
// #[Buckets = 15, SubBuckets = 2048]
}
// When doing an percentile analysis we normally require more than one percentile to be calculated for the given histogram.
//
// When that is the case ValueAtPercentiles() will deeply optimize the total time to retrieve the percentiles vs the other option
// which is multiple calls to ValueAtQuantile().
//
// nolint
func ExampleHistogram_ValueAtPercentiles() {
histogram := hdrhistogram.New(1, 30000000, 3)
for i := 0; i < 1000000; i++ {
histogram.RecordValue(int64(i))
}
percentileValuesMap := histogram.ValueAtPercentiles([]float64{50.0, 95.0, 99.0, 99.9})
fmt.Printf("Percentile 50: %d\n", percentileValuesMap[50.0])
fmt.Printf("Percentile 95: %d\n", percentileValuesMap[95.0])
fmt.Printf("Percentile 99: %d\n", percentileValuesMap[99.0])
fmt.Printf("Percentile 99.9: %d\n", percentileValuesMap[99.9])
// Output:
// Percentile 50: 500223
// Percentile 95: 950271
// Percentile 99: 990207
// Percentile 99.9: 999423
}