Ich versuche, die Effizienz von Teilen meines Codes zu testen, und C++ hat eine clock
Funktion in ctime
, die Messung der Prozessorzeit ermöglicht, die von dem Programm mit dem clock_t
-Typ verbraucht wird. Gibt es ein Rust-Äquivalent, das nicht nur die absolute Zeit zwischen zwei Punkten im Code misst?Gibt es ein Rust-Äquivalent zur Clock-Funktion in C++?
6
A
Antwort
5
Wenn es erforderlich ist clock
zu verwenden, dann werden Sie ein bisschen ein Shim hinzufügen müssen. Mindestens auf OS X scheint es, dass libc nicht clock
freigibt, aber es tut geben Sie clock_t
(was der schwierigere Teil der Gleichung ist). clock
Aussetzen dann 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);
}
Ich würde wahrscheinlich einen Wrapper machen, die zwar unter allen Umständen nennen clock
als sicher markiert.
+1
Kennen Sie einen Grund, warum 'libc' nicht' clock' enthält. 'clock' scheint in' C' stdlib zu sein. – WiSaGaN
3
Ich habe mit diesem 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;
}
Was ist falsch mit einem hochauflösenden Timer wie https://doc.rust-lang.org/time/time/fn.precise_time_ns.html? –
'libc' Kiste,' Uhr' Funktion –
@Ker, OP fragt nach Benutzer-CPU-Zeit, nicht Wanduhrzeit. – WiSaGaN