Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a Rust equivalent to the clock function in C++?

Tags:

rust

libc

I'm trying to test the efficiency of parts of my code, and C++ has a clock function in ctime that allows measurement of the processor time consumed by the program using the clock_t type. Is there some Rust equivalent that isn't just measuring the absolute time between two points in the code?

like image 663
Harvey Adcock Avatar asked Apr 19 '16 11:04

Harvey Adcock


2 Answers

If it's required to use clock, then you will need to add a bit of a shim. At least on OS X, it appears that libc doesn't expose clock, but it does give you clock_t (which is the harder part of the equation). Exposing clock is then straight-forward:

extern crate libc;

mod ffi {
    extern {
        pub fn clock() -> ::libc::clock_t;
    }
}

fn main() {
    let start = unsafe { ffi::clock() };

    let mut dummy = 0;
    for i in 0..20000 { dummy += i };

    let end = unsafe { ffi::clock() };
    println!("{}, {}, {}, {}", dummy, start, end, end - start);
}

I'd probably make a wrapper that marks clock as safe to call in any circumstance though.

like image 57
Shepmaster Avatar answered Oct 19 '22 11:10

Shepmaster


I've been using this code:

extern crate libc;

use std::mem;
use std::io;
use std::time::Duration;

pub fn cpu_time() -> Duration {
    unsafe {
        let mut tp = mem::uninitialized();
        if sys::clock_gettime(sys::CLOCK_PROCESS_CPUTIME_ID, &mut tp) == 0 {
            Duration::new(tp.tv_sec as u64, tp.tv_nsec as u32)
        } else {
            panic!("cpu_time: {}", io::Error::last_os_error());
        }
    }
}

mod sys {
    use libc::{c_int, timespec};
    extern "C" {
        pub fn clock_gettime(clk_id: c_int, tp: *mut timespec) -> c_int;
    }
    pub const CLOCK_PROCESS_CPUTIME_ID: c_int = 2;
}
like image 32
malbarbo Avatar answered Oct 19 '22 12:10

malbarbo