@@ -9,107 +9,131 @@ use hdrsample::serialization::*;
9
9
use self :: rand:: distributions:: range:: Range ;
10
10
use self :: rand:: distributions:: IndependentSample ;
11
11
use self :: test:: Bencher ;
12
- use std:: io:: Cursor ;
12
+ use std:: io:: { Cursor , Write } ;
13
+ use std:: fmt:: Debug ;
13
14
14
15
#[ bench]
15
- fn serialize_tiny_dense ( b : & mut Bencher ) {
16
+ fn serialize_tiny_dense_v2 ( b : & mut Bencher ) {
16
17
// 256 + 3 * 128 = 640 counts
17
- do_serialize_bench ( b, 1 , 2047 , 2 , 1.5 )
18
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 2 , 1.5 )
18
19
}
19
20
20
21
#[ bench]
21
- fn serialize_tiny_sparse ( b : & mut Bencher ) {
22
+ fn serialize_tiny_sparse_v2 ( b : & mut Bencher ) {
22
23
// 256 + 3 * 128 = 640 counts
23
- do_serialize_bench ( b, 1 , 2047 , 2 , 0.1 )
24
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 2 , 0.1 )
24
25
}
25
26
26
27
#[ bench]
27
- fn serialize_small_dense ( b : & mut Bencher ) {
28
+ fn serialize_small_dense_v2 ( b : & mut Bencher ) {
28
29
// 2048 counts
29
- do_serialize_bench ( b, 1 , 2047 , 3 , 1.5 )
30
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 3 , 1.5 )
30
31
}
31
32
32
33
#[ bench]
33
- fn serialize_small_sparse ( b : & mut Bencher ) {
34
+ fn serialize_small_sparse_v2 ( b : & mut Bencher ) {
34
35
// 2048 counts
35
- do_serialize_bench ( b, 1 , 2047 , 3 , 0.1 )
36
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 3 , 0.1 )
36
37
}
37
38
38
39
#[ bench]
39
- fn serialize_medium_dense ( b : & mut Bencher ) {
40
+ fn serialize_medium_dense_v2 ( b : & mut Bencher ) {
40
41
// 56320 counts
41
- do_serialize_bench ( b, 1 , u64:: max_value ( ) , 3 , 1.5 )
42
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 3 , 1.5 )
42
43
}
43
44
44
45
#[ bench]
45
- fn serialize_medium_sparse ( b : & mut Bencher ) {
46
+ fn serialize_medium_sparse_v2 ( b : & mut Bencher ) {
46
47
// 56320 counts
47
- do_serialize_bench ( b, 1 , u64:: max_value ( ) , 3 , 0.1 )
48
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 3 , 0.1 )
48
49
}
49
50
50
51
#[ bench]
51
- fn serialize_large_dense ( b : & mut Bencher ) {
52
+ fn serialize_large_dense_v2 ( b : & mut Bencher ) {
52
53
// 6291456 buckets
53
- do_serialize_bench ( b, 1 , u64:: max_value ( ) , 5 , 1.5 )
54
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 1.5 )
54
55
}
55
56
56
57
#[ bench]
57
- fn serialize_large_sparse ( b : & mut Bencher ) {
58
+ fn serialize_large_sparse_v2 ( b : & mut Bencher ) {
58
59
// 6291456 buckets
59
- do_serialize_bench ( b, 1 , u64:: max_value ( ) , 5 , 0.1 )
60
+ do_serialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 0.1 )
60
61
}
61
62
62
63
#[ bench]
63
- fn deserialize_tiny_dense ( b : & mut Bencher ) {
64
+ fn serialize_large_dense_v2_deflate ( b : & mut Bencher ) {
65
+ // 6291456 buckets
66
+ do_serialize_bench ( b, & mut V2DeflateSerializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 1.5 )
67
+ }
68
+
69
+ #[ bench]
70
+ fn serialize_large_sparse_v2_deflate ( b : & mut Bencher ) {
71
+ // 6291456 buckets
72
+ do_serialize_bench ( b, & mut V2DeflateSerializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 0.1 )
73
+ }
74
+
75
+ #[ bench]
76
+ fn deserialize_tiny_dense_v2 ( b : & mut Bencher ) {
64
77
// 256 + 3 * 128 = 640 counts
65
- do_deserialize_bench ( b, 1 , 2047 , 2 , 1.5 )
78
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 2 , 1.5 )
66
79
}
67
80
68
81
#[ bench]
69
- fn deserialize_tiny_sparse ( b : & mut Bencher ) {
82
+ fn deserialize_tiny_sparse_v2 ( b : & mut Bencher ) {
70
83
// 256 + 3 * 128 = 640 counts
71
- do_deserialize_bench ( b, 1 , 2047 , 2 , 0.1 )
84
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 2 , 0.1 )
72
85
}
73
86
74
87
#[ bench]
75
- fn deserialize_small_dense ( b : & mut Bencher ) {
88
+ fn deserialize_small_dense_v2 ( b : & mut Bencher ) {
76
89
// 2048 counts
77
- do_deserialize_bench ( b, 1 , 2047 , 3 , 1.5 )
90
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 3 , 1.5 )
78
91
}
79
92
80
93
#[ bench]
81
- fn deserialize_small_sparse ( b : & mut Bencher ) {
94
+ fn deserialize_small_sparse_v2 ( b : & mut Bencher ) {
82
95
// 2048 counts
83
- do_deserialize_bench ( b, 1 , 2047 , 3 , 0.1 )
96
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , 2047 , 3 , 0.1 )
84
97
}
85
98
86
99
#[ bench]
87
- fn deserialize_medium_dense ( b : & mut Bencher ) {
100
+ fn deserialize_medium_dense_v2 ( b : & mut Bencher ) {
88
101
// 56320 counts
89
- do_deserialize_bench ( b, 1 , u64:: max_value ( ) , 3 , 1.5 )
102
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 3 , 1.5 )
90
103
}
91
104
92
105
#[ bench]
93
- fn deserialize_medium_sparse ( b : & mut Bencher ) {
106
+ fn deserialize_medium_sparse_v2 ( b : & mut Bencher ) {
94
107
// 56320 counts
95
- do_deserialize_bench ( b, 1 , u64:: max_value ( ) , 3 , 0.1 )
108
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 3 , 0.1 )
109
+ }
110
+
111
+ #[ bench]
112
+ fn deserialize_large_dense_v2 ( b : & mut Bencher ) {
113
+ // 6291456 buckets
114
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 1.5 )
96
115
}
97
116
98
117
#[ bench]
99
- fn deserialize_large_dense ( b : & mut Bencher ) {
118
+ fn deserialize_large_sparse_v2 ( b : & mut Bencher ) {
100
119
// 6291456 buckets
101
- do_deserialize_bench ( b, 1 , u64:: max_value ( ) , 5 , 1.5 )
120
+ do_deserialize_bench ( b, & mut V2Serializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 0.1 )
102
121
}
103
122
104
123
#[ bench]
105
- fn deserialize_large_sparse ( b : & mut Bencher ) {
124
+ fn deserialize_large_dense_v2_deflate ( b : & mut Bencher ) {
106
125
// 6291456 buckets
107
- do_deserialize_bench ( b, 1 , u64:: max_value ( ) , 5 , 0.1 )
126
+ do_deserialize_bench ( b, & mut V2DeflateSerializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 1.5 )
108
127
}
109
128
129
+ #[ bench]
130
+ fn deserialize_large_sparse_v2_deflate ( b : & mut Bencher ) {
131
+ // 6291456 buckets
132
+ do_deserialize_bench ( b, & mut V2DeflateSerializer :: new ( ) , 1 , u64:: max_value ( ) , 5 , 0.1 )
133
+ }
110
134
111
- fn do_serialize_bench ( b : & mut Bencher , low : u64 , high : u64 , digits : u8 , fraction_of_counts_len : f64 ) {
112
- let mut s = V2Serializer :: new ( ) ;
135
+ fn do_serialize_bench < S > ( b : & mut Bencher , s : & mut S , low : u64 , high : u64 , digits : u8 , fraction_of_counts_len : f64 )
136
+ where S : TestOnlyHypotheticalSerializerInterface {
113
137
let mut h = Histogram :: < u64 > :: new_with_bounds ( low, high, digits) . unwrap ( ) ;
114
138
let random_counts = ( fraction_of_counts_len * h. len ( ) as f64 ) as usize ;
115
139
let mut vec = Vec :: with_capacity ( random_counts) ;
@@ -128,8 +152,8 @@ fn do_serialize_bench(b: &mut Bencher, low: u64, high: u64, digits: u8, fraction
128
152
} ) ;
129
153
}
130
154
131
- fn do_deserialize_bench ( b : & mut Bencher , low : u64 , high : u64 , digits : u8 , fraction_of_counts_len : f64 ) {
132
- let mut s = V2Serializer :: new ( ) ;
155
+ fn do_deserialize_bench < S > ( b : & mut Bencher , s : & mut S , low : u64 , high : u64 , digits : u8 , fraction_of_counts_len : f64 )
156
+ where S : TestOnlyHypotheticalSerializerInterface {
133
157
let mut h = Histogram :: < u64 > :: new_with_bounds ( low, high, digits) . unwrap ( ) ;
134
158
let random_counts = ( fraction_of_counts_len * h. len ( ) as f64 ) as usize ;
135
159
let mut vec = Vec :: with_capacity ( random_counts) ;
@@ -149,3 +173,30 @@ fn do_deserialize_bench(b: &mut Bencher, low: u64, high: u64, digits: u8, fracti
149
173
let _: Histogram < u64 > = d. deserialize ( & mut cursor) . unwrap ( ) ;
150
174
} ) ;
151
175
}
176
+
177
+ // Maybe someday there will be an obvious right answer for what serialization should look like, at
178
+ // least to the user, but for now we'll only take an easily reversible step towards that. There are
179
+ // still several ways the serializer interfaces could change to achieve better performance, so
180
+ // committing to anything right now would be premature.
181
+ trait TestOnlyHypotheticalSerializerInterface {
182
+ type SerializeError : Debug ;
183
+
184
+ fn serialize < T : Counter , W : Write > ( & mut self , h : & Histogram < T > , writer : & mut W )
185
+ -> Result < usize , Self :: SerializeError > ;
186
+ }
187
+
188
+ impl TestOnlyHypotheticalSerializerInterface for V2Serializer {
189
+ type SerializeError = V2SerializeError ;
190
+
191
+ fn serialize < T : Counter , W : Write > ( & mut self , h : & Histogram < T > , writer : & mut W ) -> Result < usize , Self :: SerializeError > {
192
+ self . serialize ( h, writer)
193
+ }
194
+ }
195
+
196
+ impl TestOnlyHypotheticalSerializerInterface for V2DeflateSerializer {
197
+ type SerializeError = V2DeflateSerializeError ;
198
+
199
+ fn serialize < T : Counter , W : Write > ( & mut self , h : & Histogram < T > , writer : & mut W ) -> Result < usize , Self :: SerializeError > {
200
+ self . serialize ( h, writer)
201
+ }
202
+ }
0 commit comments