Skip to content

Commit 7f64ddd

Browse files
authored
Splitting profile_proto example (#208)
Signed-off-by: hi-rustin <[email protected]>
1 parent ed75af8 commit 7f64ddd

File tree

3 files changed

+117
-4
lines changed

3 files changed

+117
-4
lines changed

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,13 @@ name = "flamegraph"
5959
required-features = ["flamegraph"]
6060

6161
[[example]]
62-
name = "profile_proto"
62+
name = "profile_proto_with_prost"
6363
required-features = ["protobuf", "prost-codec"]
6464

65+
[[example]]
66+
name = "profile_proto_with_protobuf_codec"
67+
required-features = ["protobuf", "protobuf-codec"]
68+
6569
[[example]]
6670
name = "multithread_flamegraph"
6771
required-features = ["flamegraph"]

examples/profile_proto_with_prost.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
2+
3+
use pprof::protos::Message;
4+
use std::fs::File;
5+
use std::io::Write;
6+
7+
#[inline(never)]
8+
fn is_prime_number1(v: usize, prime_numbers: &[usize]) -> bool {
9+
if v < 10000 {
10+
let r = prime_numbers.binary_search(&v);
11+
return r.is_ok();
12+
}
13+
14+
for n in prime_numbers {
15+
if v % n == 0 {
16+
return false;
17+
}
18+
}
19+
20+
true
21+
}
22+
23+
#[inline(always)]
24+
fn is_prime_number2(v: usize, prime_numbers: &[usize]) -> bool {
25+
if v < 10000 {
26+
let r = prime_numbers.binary_search(&v);
27+
return r.is_ok();
28+
}
29+
30+
for n in prime_numbers {
31+
if v % n == 0 {
32+
return false;
33+
}
34+
}
35+
36+
true
37+
}
38+
39+
#[inline(never)]
40+
fn is_prime_number3(v: usize, prime_numbers: &[usize]) -> bool {
41+
if v < 10000 {
42+
let r = prime_numbers.binary_search(&v);
43+
return r.is_ok();
44+
}
45+
46+
for n in prime_numbers {
47+
if v % n == 0 {
48+
return false;
49+
}
50+
}
51+
52+
true
53+
}
54+
55+
#[inline(never)]
56+
fn prepare_prime_numbers() -> Vec<usize> {
57+
// bootstrap: Generate a prime table of 0..10000
58+
let mut prime_number_table: [bool; 10000] = [true; 10000];
59+
prime_number_table[0] = false;
60+
prime_number_table[1] = false;
61+
for i in 2..10000 {
62+
if prime_number_table[i] {
63+
let mut v = i * 2;
64+
while v < 10000 {
65+
prime_number_table[v] = false;
66+
v += i;
67+
}
68+
}
69+
}
70+
let mut prime_numbers = vec![];
71+
for (i, exist) in prime_number_table.iter().enumerate().skip(2) {
72+
if *exist {
73+
prime_numbers.push(i);
74+
}
75+
}
76+
prime_numbers
77+
}
78+
79+
fn main() {
80+
let prime_numbers = prepare_prime_numbers();
81+
82+
let guard = pprof::ProfilerGuard::new(100).unwrap();
83+
84+
let mut v = 0;
85+
86+
for i in 2..5000000 {
87+
if i % 4 == 0 {
88+
if is_prime_number1(i, &prime_numbers) {
89+
v += 1;
90+
}
91+
} else if i % 4 == 1 {
92+
if is_prime_number2(i, &prime_numbers) {
93+
v += 1;
94+
}
95+
} else if is_prime_number3(i, &prime_numbers) {
96+
v += 1;
97+
}
98+
}
99+
100+
println!("Prime numbers: {}", v);
101+
102+
if let Ok(report) = guard.report().build() {
103+
let mut file = File::create("profile.pb").unwrap();
104+
let profile = report.pprof().unwrap();
105+
106+
let mut content = Vec::new();
107+
profile.encode(&mut content).unwrap();
108+
file.write_all(&content).unwrap();
109+
110+
println!("report: {:?}", report);
111+
};
112+
}

examples/profile_proto.rs renamed to examples/profile_proto_with_protobuf_codec.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@ fn main() {
104104
let profile = report.pprof().unwrap();
105105

106106
let mut content = Vec::new();
107-
#[cfg(not(feature = "protobuf-codec"))]
108-
profile.encode(&mut content).unwrap();
109-
#[cfg(feature = "protobuf-codec")]
110107
profile.write_to_vec(&mut content).unwrap();
111108
file.write_all(&content).unwrap();
112109

0 commit comments

Comments
 (0)