1
+ /*
2
+ The benchmark results:
3
+ criterion = "0.5.1"
4
+ OS: Ubuntu 22.04.3 LTS (5.15.146.1-microsoft-standard-WSL2)
5
+ Hardware: AMD EPYC 7763 64-Core Processor - 2.44 GHz, 16vCPUs,
6
+ RAM: 64.0 GB
7
+ | Test | Average time|
8
+ |--------------------------------|-------------|
9
+ | Counter_Add_Sorted | 586 ns |
10
+ | Counter_Add_Unsorted | 592 ns |
11
+ | Random_Generator_5 | 377 ns |
12
+ | ThreadLocal_Random_Generator_5 | 37 ns |
13
+ */
14
+
1
15
use criterion:: { criterion_group, criterion_main, Criterion } ;
2
16
use opentelemetry:: {
3
17
metrics:: { Counter , MeterProvider as _} ,
4
18
KeyValue ,
5
19
} ;
6
20
use opentelemetry_sdk:: metrics:: { ManualReader , SdkMeterProvider } ;
7
- use rand:: { rngs:: SmallRng , Rng , SeedableRng } ;
21
+ use rand:: {
22
+ rngs:: { self , SmallRng } ,
23
+ Rng , SeedableRng ,
24
+ } ;
25
+ use std:: cell:: RefCell ;
26
+
27
+ thread_local ! {
28
+ /// Store random number generator for each thread
29
+ static CURRENT_RNG : RefCell <rngs:: SmallRng > = RefCell :: new( rngs:: SmallRng :: from_entropy( ) ) ;
30
+ }
8
31
9
32
// Run this benchmark with:
10
33
// cargo bench --bench metric_counter --features=metrics
@@ -30,12 +53,12 @@ fn counter_add(c: &mut Criterion) {
30
53
let counter = create_counter ( ) ;
31
54
c. bench_function ( "Counter_Add_Sorted" , |b| {
32
55
b. iter ( || {
33
- let mut rng = SmallRng :: from_entropy ( ) ;
34
56
// 4*4*10*10 = 1600 time series.
35
- let index_first_attribute = rng. gen_range ( 0 ..4 ) ;
36
- let index_second_attribute = rng. gen_range ( 0 ..4 ) ;
37
- let index_third_attribute = rng. gen_range ( 0 ..10 ) ;
38
- let index_forth_attribute = rng. gen_range ( 0 ..10 ) ;
57
+ let rands = CURRENT_RNG . with_borrow_mut ( |rng| [ rng. gen_range ( 0 ..4 ) , rng. gen_range ( 0 ..4 ) , rng. gen_range ( 0 ..10 ) , rng. gen_range ( 0 ..10 ) ] ) ;
58
+ let index_first_attribute = rands[ 0 ] ;
59
+ let index_second_attribute = rands[ 1 ] ;
60
+ let index_third_attribute = rands[ 2 ] ;
61
+ let index_forth_attribute = rands[ 3 ] ;
39
62
counter. add (
40
63
1 ,
41
64
& [
@@ -50,12 +73,12 @@ fn counter_add(c: &mut Criterion) {
50
73
51
74
c. bench_function ( "Counter_Add_Unsorted" , |b| {
52
75
b. iter ( || {
53
- let mut rng = SmallRng :: from_entropy ( ) ;
54
76
// 4*4*10*10 = 1600 time series.
55
- let index_first_attribute = rng. gen_range ( 0 ..4 ) ;
56
- let index_second_attribute = rng. gen_range ( 0 ..4 ) ;
57
- let index_third_attribute = rng. gen_range ( 0 ..10 ) ;
58
- let index_forth_attribute = rng. gen_range ( 0 ..10 ) ;
77
+ let rands = CURRENT_RNG . with_borrow_mut ( |rng| [ rng. gen_range ( 0 ..4 ) , rng. gen_range ( 0 ..4 ) , rng. gen_range ( 0 ..10 ) , rng. gen_range ( 0 ..10 ) ] ) ;
78
+ let index_first_attribute = rands[ 0 ] ;
79
+ let index_second_attribute = rands[ 1 ] ;
80
+ let index_third_attribute = rands[ 2 ] ;
81
+ let index_forth_attribute = rands[ 3 ] ;
59
82
counter. add (
60
83
1 ,
61
84
& [
@@ -78,6 +101,12 @@ fn counter_add(c: &mut Criterion) {
78
101
let _i5 = rng. gen_range ( 0 ..10 ) ;
79
102
} ) ;
80
103
} ) ;
104
+
105
+ c. bench_function ( "ThreadLocal_Random_Generator_5" , |b| {
106
+ b. iter ( || {
107
+ let _i1 = CURRENT_RNG . with_borrow_mut ( |rng| [ rng. gen_range ( 0 ..4 ) , rng. gen_range ( 0 ..4 ) , rng. gen_range ( 0 ..10 ) , rng. gen_range ( 0 ..10 ) , rng. gen_range ( 0 ..10 ) ] ) ;
108
+ } ) ;
109
+ } ) ;
81
110
}
82
111
83
112
criterion_group ! ( benches, criterion_benchmark) ;
0 commit comments