HDRHistogram 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +8 -2
- data/ext/ruby_hdr_histogram/ruby_hdr_histogram.c +112 -57
- data/lib/HDRHistogram.rb +47 -3
- data/lib/HDRHistogram/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99f2a4bb0a67363e2249f38122fc2b18bf5cd49045386030c969b2bf8ac6edb1
|
4
|
+
data.tar.gz: 6bcfe26d7ed7c0abf786b100824a476d534c31aa86d94c9116d803d7f38d57f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b2e8a471d12a7689200361eb5a23197ca194ea11aa4d8e05beaa966877a37d84740018a6e72336ee2d092fdfdafdccd101440e946f4f06bdf549476f5aae20a
|
7
|
+
data.tar.gz: ab07d7649ded6ee83d6ac733a4ba3e534334e5a974b41ea622a8303c004cba6feac980fdab079908e44df79f60f1ac8510ae112367fc4f8f4711242013d65c6a
|
data/README.md
CHANGED
@@ -77,8 +77,9 @@ Create new HDRHistogram object.
|
|
77
77
|
- `significant_figures`: The level of precision for this histogram, i.e. the number of figures in a decimal number that will be maintained. E.g. a value of 3 will mean the results from the histogram will be accurate up to the first three digits. Must be a value between 1 and 5 (inclusive).
|
78
78
|
- `:multiplier`: A multiplier to adjust all incoming values. If present, the raw value recorded in the histogram for `record(val)` will be `val * 1/multiplier`. Similarly, `percentile(pctl) => val * multiplier`. If `multiplier` < 1, `lowest_value` can be < 1 so that `lowest_value` * 1/`multiplier` == 1.
|
79
79
|
- `:unit`: A unit for labeling histogram values. Useful for outputting things.
|
80
|
-
|
81
|
-
|
80
|
+
|
81
|
+
#### `hdr = HDRHistogram.unserialize(serialized_histogram_string)`
|
82
|
+
restore an HDRHistogram object and its data from serialized string.
|
82
83
|
|
83
84
|
#### `hdr.record(value)`
|
84
85
|
Records a `value` in the histogram, will round this `value` of to a precision at or better than the `significant_figures` specified at construction time.
|
@@ -146,4 +147,9 @@ Get a formatted string with percentile stats of the histogram useful for latency
|
|
146
147
|
# 99.999% 1000.447ms
|
147
148
|
# 100.000% 1000.447ms
|
148
149
|
```
|
150
|
+
|
149
151
|
The above output assumes a :multiplier of 0.001 and a :unit of `:ms`
|
152
|
+
|
153
|
+
#### `hdr.serialize`
|
154
|
+
serialize the HDRHistogram object and data into a string
|
155
|
+
|
@@ -41,6 +41,61 @@ static VALUE histogram_new(int argc, VALUE* argv, VALUE class) {
|
|
41
41
|
return self;
|
42
42
|
}
|
43
43
|
|
44
|
+
static VALUE histogram_clone(VALUE self_src) {
|
45
|
+
GET_HDRHIST(hdr_src, self_src);
|
46
|
+
VALUE self;
|
47
|
+
struct hdr_histogram *hdrh;
|
48
|
+
int ret, i;
|
49
|
+
ret = hdr_init(hdr_src->lowest_trackable_value, hdr_src->highest_trackable_value, hdr_src->significant_figures, &hdrh);
|
50
|
+
if(ret == EINVAL) {
|
51
|
+
rb_raise(HDRHistogramError, "%s", "lowest_trackable_value must be >= 1");
|
52
|
+
}
|
53
|
+
else if(ret == ENOMEM) {
|
54
|
+
rb_raise(HDRHistogramError, "%s", "no memory");
|
55
|
+
}
|
56
|
+
else if(hdr_src->counts_len != hdrh->counts_len) {
|
57
|
+
rb_raise(HDRHistogramError, "%s", "bad hdrhistogram ccopy");
|
58
|
+
}
|
59
|
+
self = Data_Wrap_Struct(HDRHistogram, NULL, histogram_free, hdrh);
|
60
|
+
|
61
|
+
hdrh->lowest_trackable_value = hdr_src->lowest_trackable_value;
|
62
|
+
hdrh->highest_trackable_value = hdr_src->highest_trackable_value;
|
63
|
+
hdrh->unit_magnitude = hdr_src->unit_magnitude;
|
64
|
+
hdrh->significant_figures = hdr_src->significant_figures;
|
65
|
+
hdrh->sub_bucket_half_count_magnitude = hdr_src->sub_bucket_half_count_magnitude;
|
66
|
+
hdrh->sub_bucket_half_count = hdr_src->sub_bucket_half_count;
|
67
|
+
hdrh->sub_bucket_mask = hdr_src->sub_bucket_mask;
|
68
|
+
hdrh->sub_bucket_count = hdr_src->sub_bucket_count;
|
69
|
+
hdrh->bucket_count = hdr_src->bucket_count;
|
70
|
+
hdrh->min_value = hdr_src->min_value;
|
71
|
+
hdrh->max_value = hdr_src->max_value;
|
72
|
+
hdrh->normalizing_index_offset = hdr_src->normalizing_index_offset;
|
73
|
+
hdrh->conversion_ratio = hdr_src->conversion_ratio;
|
74
|
+
hdrh->counts_len = hdr_src->counts_len;
|
75
|
+
hdrh->total_count = hdr_src->total_count;
|
76
|
+
|
77
|
+
for(i=0; i<hdrh->counts_len; i++) {
|
78
|
+
hdrh->counts[i] = hdr_src->counts[i];
|
79
|
+
}
|
80
|
+
|
81
|
+
VALUE lowest = INT2NUM(hdr_src->lowest_trackable_value);
|
82
|
+
VALUE highest = INT2NUM(hdr_src->highest_trackable_value);
|
83
|
+
VALUE sig = INT2NUM(hdr_src->significant_figures);
|
84
|
+
VALUE opt = rb_hash_new();
|
85
|
+
rb_hash_aset(opt, rb_intern("multiplier"), rb_iv_get(self, "@multiplier"));
|
86
|
+
rb_hash_aset(opt, rb_intern("unit"), rb_iv_get(self, "@unit"));
|
87
|
+
|
88
|
+
VALUE argv[4];
|
89
|
+
VALUE argc = 4;
|
90
|
+
argv[0]=lowest;
|
91
|
+
argv[1]=highest;
|
92
|
+
argv[2]=sig;
|
93
|
+
argv[3]=opt;
|
94
|
+
|
95
|
+
rb_obj_call_init(self, argc, argv);
|
96
|
+
return self;
|
97
|
+
}
|
98
|
+
|
44
99
|
static VALUE histogram_reset(VALUE self) {
|
45
100
|
GET_HDRHIST(hdr, self);
|
46
101
|
hdr_reset(hdr);
|
@@ -103,42 +158,38 @@ static VALUE histogram_merge(VALUE self, VALUE another ) {
|
|
103
158
|
return INT2NUM(hdr_add(hdr, hdr2));
|
104
159
|
}
|
105
160
|
|
106
|
-
#define
|
107
|
-
static VALUE
|
161
|
+
#define HISTOGRAM_GETSETNUM_METHOD(num_name, num_type) \
|
162
|
+
static VALUE histogram_get_##num_name(VALUE self) { \
|
108
163
|
GET_HDRHIST(hdr, self); \
|
109
|
-
return
|
110
|
-
}
|
111
|
-
|
112
|
-
#define HISTOGRAM_SETNUM_METHOD(num_name, num_type) \
|
164
|
+
return num_type##2NUM(hdr->num_name); \
|
165
|
+
} \
|
166
|
+
\
|
113
167
|
static VALUE histogram_set_##num_name(VALUE self, VALUE num) { \
|
114
168
|
GET_HDRHIST(hdr, self); \
|
115
169
|
hdr->num_name = NUM2##num_type(num); \
|
116
170
|
return Qtrue; \
|
117
171
|
}
|
118
172
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
HISTOGRAM_GETINT_METHOD(bucket_count)
|
140
|
-
HISTOGRAM_GETINT_METHOD(sub_bucket_count)
|
141
|
-
HISTOGRAM_GETINT_METHOD(counts_len)
|
173
|
+
HISTOGRAM_GETSETNUM_METHOD(lowest_trackable_value, LL)
|
174
|
+
HISTOGRAM_GETSETNUM_METHOD(highest_trackable_value, LL)
|
175
|
+
HISTOGRAM_GETSETNUM_METHOD(unit_magnitude, LONG)
|
176
|
+
HISTOGRAM_GETSETNUM_METHOD(significant_figures, LONG)
|
177
|
+
HISTOGRAM_GETSETNUM_METHOD(sub_bucket_half_count_magnitude, LONG)
|
178
|
+
HISTOGRAM_GETSETNUM_METHOD(sub_bucket_half_count, LONG)
|
179
|
+
HISTOGRAM_GETSETNUM_METHOD(sub_bucket_mask, LL)
|
180
|
+
HISTOGRAM_GETSETNUM_METHOD(sub_bucket_count, LONG)
|
181
|
+
HISTOGRAM_GETSETNUM_METHOD(bucket_count, LONG)
|
182
|
+
HISTOGRAM_GETSETNUM_METHOD(min_value, LL)
|
183
|
+
HISTOGRAM_GETSETNUM_METHOD(max_value, LL)
|
184
|
+
HISTOGRAM_GETSETNUM_METHOD(normalizing_index_offset, LONG)
|
185
|
+
HISTOGRAM_GETSETNUM_METHOD(conversion_ratio, DBL)
|
186
|
+
HISTOGRAM_GETSETNUM_METHOD(counts_len, LONG)
|
187
|
+
HISTOGRAM_GETSETNUM_METHOD(total_count, LL)
|
188
|
+
|
189
|
+
#define HISTOGRAM_RUBY_PRIVATE_GETSETTERS(num_name) \
|
190
|
+
rb_define_private_method(HDRHistogram, #num_name "=", histogram_set_##num_name, 1);\
|
191
|
+
rb_define_private_method(HDRHistogram, #num_name, histogram_get_##num_name, 0)
|
192
|
+
|
142
193
|
|
143
194
|
static VALUE histogram_set_raw_count(VALUE self, VALUE index, VALUE count) {
|
144
195
|
GET_HDRHIST(hdr, self);
|
@@ -147,6 +198,18 @@ static VALUE histogram_set_raw_count(VALUE self, VALUE index, VALUE count) {
|
|
147
198
|
hdr->counts[i]=c;
|
148
199
|
return Qtrue;
|
149
200
|
}
|
201
|
+
static VALUE histogram_get_raw_count(VALUE self, VALUE index) {
|
202
|
+
VALUE count;
|
203
|
+
int i = NUM2INT(index);
|
204
|
+
GET_HDRHIST(hdr, self);
|
205
|
+
if(i >= hdr->counts_len) {
|
206
|
+
return Qnil;
|
207
|
+
}
|
208
|
+
else {
|
209
|
+
count = LL2NUM(hdr->counts[i]);
|
210
|
+
return count;
|
211
|
+
}
|
212
|
+
}
|
150
213
|
|
151
214
|
void Init_ruby_hdr_histogram() {
|
152
215
|
HDRHistogram = rb_define_class("HDRHistogram", rb_cObject);
|
@@ -160,6 +223,9 @@ void Init_ruby_hdr_histogram() {
|
|
160
223
|
rb_define_method(HDRHistogram, "memsize", histogram_memsize, 0);
|
161
224
|
rb_define_method(HDRHistogram, "count", histogram_count, 0);
|
162
225
|
|
226
|
+
rb_define_method(HDRHistogram, "clone", histogram_clone, 0);
|
227
|
+
rb_define_method(HDRHistogram, "dup", histogram_clone, 0);
|
228
|
+
|
163
229
|
rb_define_private_method(HDRHistogram, "raw_record", histogram_record_value, 1);
|
164
230
|
rb_define_private_method(HDRHistogram, "raw_record_corrected", histogram_record_corrected_value, 2);
|
165
231
|
rb_define_private_method(HDRHistogram, "raw_min", histogram_min, 0);
|
@@ -169,34 +235,23 @@ void Init_ruby_hdr_histogram() {
|
|
169
235
|
rb_define_private_method(HDRHistogram, "raw_percentile", histogram_percentile, 1);
|
170
236
|
rb_define_private_method(HDRHistogram, "raw_merge", histogram_merge, 1);
|
171
237
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
rb_define_private_method(HDRHistogram, "set_raw_count", histogram_set_raw_count, 2);
|
188
|
-
|
189
|
-
rb_define_method(HDRHistogram, "lowest_trackable_value", histogram_lowest_trackable_value, 0);
|
190
|
-
rb_define_method(HDRHistogram, "highest_trackable_value", histogram_highest_trackable_value, 0);
|
191
|
-
rb_define_private_method(HDRHistogram, "unit_magnitude", histogram_unit_magnitude, 0);
|
192
|
-
rb_define_method(HDRHistogram, "significant_figures", histogram_significant_figures, 0);
|
193
|
-
rb_define_private_method(HDRHistogram, "bucket_count", histogram_bucket_count, 0);
|
194
|
-
rb_define_private_method(HDRHistogram, "sub_bucket_count", histogram_sub_bucket_count, 0);
|
195
|
-
rb_define_private_method(HDRHistogram, "counts_len", histogram_counts_len, 0);
|
196
|
-
|
238
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(lowest_trackable_value);
|
239
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(highest_trackable_value);
|
240
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(unit_magnitude);
|
241
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(significant_figures);
|
242
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(sub_bucket_half_count_magnitude);
|
243
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(sub_bucket_half_count);
|
244
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(sub_bucket_mask);
|
245
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(sub_bucket_count);
|
246
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(bucket_count);
|
247
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(min_value);
|
248
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(max_value);
|
249
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(normalizing_index_offset);
|
250
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(conversion_ratio);
|
251
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(counts_len);
|
252
|
+
HISTOGRAM_RUBY_PRIVATE_GETSETTERS(total_count);
|
197
253
|
|
198
|
-
rb_define_private_method(HDRHistogram, "
|
199
|
-
|
200
|
-
//rb_define_private_method(HDRHistogram, "histogram_spectrum", histogram_spectrum, 2);
|
254
|
+
rb_define_private_method(HDRHistogram, "set_raw_count", histogram_set_raw_count, 2);
|
255
|
+
rb_define_private_method(HDRHistogram, "get_raw_count", histogram_get_raw_count, 1);
|
201
256
|
}
|
202
257
|
|
data/lib/HDRHistogram.rb
CHANGED
@@ -21,6 +21,12 @@ class HDRHistogram
|
|
21
21
|
counts_len = m[:counts_len].to_i
|
22
22
|
self.counts_len= counts_len
|
23
23
|
self.total_count= m[:total_count].to_i
|
24
|
+
if !opt[:multiplier] && m[:multiplier]
|
25
|
+
@multiplier = m[:multiplier].to_f
|
26
|
+
end
|
27
|
+
if !@unit && m[:unit]
|
28
|
+
@unit = m[:unit]
|
29
|
+
end
|
24
30
|
|
25
31
|
counts = m[:counts].split " "
|
26
32
|
i=0
|
@@ -99,22 +105,60 @@ class HDRHistogram
|
|
99
105
|
str
|
100
106
|
end
|
101
107
|
|
108
|
+
def serialize
|
109
|
+
attrs = [lowest_trackable_value, highest_trackable_value, unit_magnitude, significant_figures, sub_bucket_half_count_magnitude, sub_bucket_half_count, sub_bucket_mask, sub_bucket_count, bucket_count, min_value, max_value, normalizing_index_offset, ("%f" % conversion_ratio), counts_len, total_count]
|
110
|
+
|
111
|
+
raw_counts = []
|
112
|
+
numrun="~!@#$%^&*"
|
113
|
+
|
114
|
+
for i in 0...counts_len do
|
115
|
+
raw_counts << get_raw_count(i)
|
116
|
+
end
|
117
|
+
|
118
|
+
counts = []
|
119
|
+
|
120
|
+
while raw_counts.length > 0 do
|
121
|
+
num = raw_counts.shift
|
122
|
+
n = 1
|
123
|
+
if num < numrun.length
|
124
|
+
while raw_counts[0] == num
|
125
|
+
raw_counts.shift
|
126
|
+
n+=1
|
127
|
+
end
|
128
|
+
if n > 1
|
129
|
+
counts << "#{numrun[num]}#{n}"
|
130
|
+
else
|
131
|
+
counts << num
|
132
|
+
end
|
133
|
+
else
|
134
|
+
counts << num
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
out = "#{attrs.join " "} [#{counts.join " "} ]"
|
139
|
+
if @unit || @multiplier != 1
|
140
|
+
out << " (#{unit} #{multiplier})"
|
141
|
+
end
|
142
|
+
out
|
143
|
+
end
|
144
|
+
|
102
145
|
def self.adjusted_boundary_val(val, opt={})
|
103
146
|
return opt ? val * 1/(opt[:multiplier] || 1) : val
|
104
147
|
end
|
105
148
|
private_class_method :adjusted_boundary_val
|
106
149
|
|
107
150
|
def self.unserialize(str, opt={})
|
108
|
-
regex = /^(?<lowest_trackable_value>\d+) (?<highest_trackable_value>\d+) (?<unit_magnitude>\d+) (?<significant_figures>\d+) (?<sub_bucket_half_count_magnitude>\d+) (?<sub_bucket_half_count>\d+) (?<sub_bucket_mask>\d+) (?<sub_bucket_count>\d+) (?<bucket_count>\d+) (?<min_value>\d+) (?<max_value>\d+) (?<normalizing_index_offset>\d+) (?<conversion_ratio>\S+) (?<counts_len>\d+) (?<total_count>\d+) \[(?<counts>([~!@#$%^&*]?\d+ )+)\]
|
151
|
+
regex = /^(?<lowest_trackable_value>\d+) (?<highest_trackable_value>\d+) (?<unit_magnitude>\d+) (?<significant_figures>\d+) (?<sub_bucket_half_count_magnitude>\d+) (?<sub_bucket_half_count>\d+) (?<sub_bucket_mask>\d+) (?<sub_bucket_count>\d+) (?<bucket_count>\d+) (?<min_value>\d+) (?<max_value>\d+) (?<normalizing_index_offset>\d+) (?<conversion_ratio>\S+) (?<counts_len>\d+) (?<total_count>\d+) \[(?<counts>([~!@#$%^&*]?\d+ )+)\]( \((?<unit>.*) (?<multiplier>\S+)\))?/
|
109
152
|
|
110
153
|
m = str.match regex
|
111
154
|
|
112
155
|
raise HDRHistogramError, "invalid serialization pattern" if m.nil?
|
113
156
|
|
114
157
|
opt[:unserialized]=m
|
158
|
+
multiplier = opt[:multiplier] || 1
|
115
159
|
|
116
|
-
low = m[:lowest_trackable_value].to_i *
|
117
|
-
high = m[:highest_trackable_value].to_i *
|
160
|
+
low = m[:lowest_trackable_value].to_i * multiplier
|
161
|
+
high = m[:highest_trackable_value].to_i * multiplier
|
118
162
|
hdrh = self.new(low, high, m[:significant_figures].to_i, opt)
|
119
163
|
|
120
164
|
return hdrh
|
data/lib/HDRHistogram/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: HDRHistogram
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leo P.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|