是否有等同于 C++ 中时钟函数的 Rust?
Is there a Rust equivalent to the clock function in C++?
我正在尝试测试部分代码的效率,C++ 在 ctime
中有一个 clock
函数,可以使用 [=] 测量程序消耗的处理器时间12=] 类型。是否有一些 Rust 等价物不只是测量代码中两点之间的绝对时间?
我一直在使用这个代码:
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;
}
如果需要使用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
标记为在任何情况下都可以安全调用。
我正在尝试测试部分代码的效率,C++ 在 ctime
中有一个 clock
函数,可以使用 [=] 测量程序消耗的处理器时间12=] 类型。是否有一些 Rust 等价物不只是测量代码中两点之间的绝对时间?
我一直在使用这个代码:
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;
}
如果需要使用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
标记为在任何情况下都可以安全调用。