目前,我有以下 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时间。这就是为什么我需要确保这一点。因此,我不能使用简单的忙循环,也不能简单地休眠。
1条答案
按热度按时间wyyhbhjk1#
我按照Sven Marnach的建议实现了以下功能:
如果我将
n
设置为8,则需要大约2秒的时间。我希望性能更好(1秒,因为我有8个vCPU),但我猜开销与操作系统调度策略相对应。