1use gpui::SharedString;
2
3#[inline]
4pub fn measurement_enabled() -> bool {
5 std::env::var("ZED_MEASUREMENTS").is_ok() || std::env::var("GPUI_MEASUREMENTS").is_ok()
6}
7
8#[inline]
10#[track_caller]
11pub fn measure_if(name: impl Into<SharedString>, if_: bool, f: impl FnOnce()) {
12 if if_ && measurement_enabled() {
13 let measure = Measure::new(name);
14 f();
15 measure.end();
16 } else {
17 f();
18 }
19}
20
21#[inline]
23#[track_caller]
24pub fn measure(name: impl Into<SharedString>, f: impl FnOnce()) {
25 measure_if(name, true, f);
26}
27
28pub struct Measure {
30 name: SharedString,
31 start: instant::Instant,
32}
33
34impl Measure {
35 #[track_caller]
36 pub fn new(name: impl Into<SharedString>) -> Self {
37 Self {
38 name: name.into(),
39 start: instant::Instant::now(),
40 }
41 }
42
43 #[track_caller]
44 pub fn end(self) {
45 let duration = self.start.elapsed();
46 tracing::trace!("{} in {:?}", self.name, duration);
47 }
48}