2016-04-19 18 views
6

Sto provando a verificare l'efficienza delle parti del mio codice e C++ ha una funzione clock in ctime che consente di misurare il tempo del processore consumato dal programma utilizzando il tipo clock_t. Esiste un equivalente di ruggine che non si limiti a misurare il tempo assoluto tra due punti nel codice?Esiste una ruggine equivalente alla funzione orologio in C++?

+0

Cosa c'è di sbagliato in un timer ad alta risoluzione come https://doc.rust-lang.org/time/time/fn.precise_time_ns.html? –

+2

gabbia 'libc'', funzione' orologio' –

+2

@Ker, OP sta chiedendo informazioni sul tempo di CPU dell'utente, non sul tempo dell'orologio a muro. – WiSaGaN

risposta

5

Se è necessario utilizzare clock, allora si avrà bisogno di aggiungere un po 'di spessore. Almeno su OS X, sembra che libc non esponga clock, ma è dare clock_t (che è la parte più difficile dell'equazione). Esporre clock è quindi diretta:

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

probabilmente sarei fare un wrapper che segna clock come sicuro da chiamare in ogni circostanza però.

+1

Conoscere qualsiasi motivo per cui 'libc' non include' clock'. 'clock' sembra essere in' C' stdlib. – WiSaGaN

3

Sto usando questo codice:

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; 
} 
Problemi correlati