1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use std::time;

pub struct Testmark { name: &'static str, start_time: u128, end_time: u128}

pub trait Timer {
    fn new(name: &'static str) -> Self;
    fn name(&self) -> &'static str;
}

impl Testmark {
    pub fn start(&mut self) -> u128 {
        self.start_time = time::UNIX_EPOCH.elapsed().unwrap().as_micros();
        self.start_time
    }
    pub fn stop(&mut self) -> u128 {
        self.end_time = time::UNIX_EPOCH.elapsed().unwrap().as_micros();
        self.end_time
    }  
    pub fn time(&mut self) -> u128 {
        if self.end_time == 0 {
            time::UNIX_EPOCH.elapsed().unwrap().as_micros() - self.start_time
        } else {
            self.end_time - self.start_time
        }
    }
    pub fn print(&mut self) {
        println!("{0} took {1:.3} ms", self.name(), self.time() as f32 / 1000.00)
    }
}

impl Timer for Testmark {
    fn new(name: &'static str) -> Testmark {
        Testmark { name: name, start_time: 0, end_time: 0 }
    }
    fn name(&self) -> &'static str {
        self.name
    }
}