2016-04-19 9 views
6

私は自分のコードの部分の効率をテストしようとしていますが、C++は型を使ってプログラムが消費するプロセッサ時間を測定できるctimeclockという関数を持っています。コード内の2つのポイント間の絶対時間を測定するだけではない、いくつかのRust同等物はありますか?私はこのコードを使用してきたC++のclock関数に相当するRustはありますか?

+0

https://doc.rust-lang.org/time/time/fn.precise_time_ns.htmlのような高解像度タイマーで何が問題になっていますか? –

+2

'libc' crate、' clock'関数 –

+2

@Ker、OPは壁時計の時刻ではなく、ユーザのCPU時間について質問しています。 – WiSaGaN

答えて

5

することは、あなたはシムのビットを追加する必要があります。少なくともOS Xでは、libcはclockを公開していないようですが、になります。これはclock_tです(方程式のより難しい部分です)。 clockを公開することは、その後ストレートフォワードです:

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); 
} 

私はおそらくかかわらず、どのような状況で呼び出すことがclockとして安全をマークラッパーを作ると思います。

+1

'libc'に' clock'が含まれていない理由を知りましょう。 'clock'は' C' stdlibにあるようです。 – WiSaGaN

3

:それはclockを使用するためにを必要なら

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; 
} 
関連する問題