我有这个代码:
let k = time::Instant::now(); thread::sleep(time::Duration::from_micros(10)); let elapsed = k.elapsed().as_micros(); println!("{}", elapsed);
字符串我的输出总是在70到90之间。我希望它是10,为什么这个数字是7倍?
bpzcxfmw1#
这实际上与Rust没有任何关系。在一个典型的多处理、用户交互式操作系统(即,您使用过的每个消费者操作系统)上,您的线程并不特殊。它是众多中的一个,CPU需要共享。你的操作系统有一个叫做调度程序的组件,它的工作是共享硬件资源。它会经常从CPU上 Boot 你的线程。这通常发生在:1.每次系统调用时1.每次中断命中CPU时1.当调度程序将您踢出以给予其他进程/线程一个机会时(这称为抢占,通常每秒发生10次)因此,您的用户态进程不可能以如此高的精度执行任何与时间相关的操作。您可以探索以下几种解决方案:
如果您在userland进程上运行一些简单的代码,我认为最简单的方法就是固定您的进程。您现有的代码将按原样工作,您只会失去其中一个核心的吞吐量(但幸运的是,您有多个核心)。
1条答案
按热度按时间bpzcxfmw1#
这实际上与Rust没有任何关系。
在一个典型的多处理、用户交互式操作系统(即,您使用过的每个消费者操作系统)上,您的线程并不特殊。它是众多中的一个,CPU需要共享。
你的操作系统有一个叫做调度程序的组件,它的工作是共享硬件资源。它会经常从CPU上 Boot 你的线程。这通常发生在:
1.每次系统调用时
1.每次中断命中CPU时
1.当调度程序将您踢出以给予其他进程/线程一个机会时(这称为抢占,通常每秒发生10次)
因此,您的用户态进程不可能以如此高的精度执行任何与时间相关的操作。
您可以探索以下几种解决方案:
如果您在userland进程上运行一些简单的代码,我认为最简单的方法就是固定您的进程。您现有的代码将按原样工作,您只会失去其中一个核心的吞吐量(但幸运的是,您有多个核心)。