rust CPU时间休眠而不是挂钟时间休眠

j9per5c4  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(147)

目前,我有以下 rust 玩具程序:

use rayon::prelude::*;
use std::{env, thread, time};

/// Sleeps 1 seconds n times parallely using rayon
fn rayon_sleep(n: usize) {
    let millis = vec![0; n];
    millis
        .par_iter()
        .for_each(|_| thread::sleep(time::Duration::from_millis(1000)));
}

fn main() {
    let args: Vec<String> = env::args().collect();
    let n = args[1].parse::<usize>().unwrap();

    let now = time::Instant::now();
    rayon_sleep(n);
    println!("rayon: {:?}", now.elapsed());
}

基本上,我的程序接受一个输入参数n。然后,我休眠1秒n次。程序使用rayon并行执行休眠任务。
然而,这并不是我想要的,据我所知,thread::sleep是根据挂钟时间休眠的,然而,我希望让一个虚拟CPU在CPU时间中保持1秒的忙状态。
有什么办法可以做到吗?

    • 编辑**

我想澄清这一点:我不介意操作系统抢占任务,但是,如果发生这种情况,那么我不想考虑任务在就绪/等待队列中花费的时间。

    • 编辑**

这是我需要做的一个简单的,说明性的例子。实际上,我必须为一个机箱开发一个基准,允许使用DEVS形式定义和模拟模型。基准的目的是相互比较符合DEVS的库,它明确地说,模型必须花费固定的,已知量的CPU时间。这就是为什么我需要确保这一点。因此,我不能使用简单的忙循环,也不能简单地休眠。

wyyhbhjk

wyyhbhjk1#

我按照Sven Marnach的建议实现了以下功能:

use cpu_time::ThreadTime;
use rayon::prelude::*;
use std::{env, thread, time};
/// Sleeps 1 seconds n times parallely using rayon
fn rayon_sleep(n: usize) {
    let millis = vec![0; n];
    millis.par_iter().for_each(|_| {
        let duration = time::Duration::from_millis(1000);
        let mut x: u32 = 0;
        let now = ThreadTime::now(); // get current thread time
        while now.elapsed() < duration { // active sleep
            std::hint::black_box(&mut x); // to avoid compiler optimizations
            x = x.wrapping_add(1);
        }
    });
}

fn main() {
    let args: Vec<String> = env::args().collect();
    let n = args[1].parse::<usize>().unwrap();

    let now = time::Instant::now();
    rayon_sleep(n);
    println!("rayon: {:?}", now.elapsed());
}

如果我将n设置为8,则需要大约2秒的时间。我希望性能更好(1秒,因为我有8个vCPU),但我猜开销与操作系统调度策略相对应。

相关问题