Я пытаюсь проверить эффективность частей моего кода, а C++ имеет функцию clock
в ctime
, которая позволяет измерять время процессора, потребляемое программой, с использованием типа clock_t
. Есть ли какой-то эквивалент Rust, который не просто измеряет абсолютное время между двумя точками кода?Есть ли Rust, эквивалентный функции часов в C++?
6
A
ответ
5
Если это требуется использовать clock
, то вам нужно будет добавить немного шайбы. По крайней мере, на 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
Я использую этот код:
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;
}
Что случилось с таймером с высоким разрешением, например https://doc.rust-lang.org/time/time/fn.precise_time_ns.html? –
'libc' crate,' clock' function –
@Ker, OP спрашивает о времени пользователя cpu, а не о настенных часах. – WiSaGaN