gpt4 book ai didi

.net - 省电 SpinWait

转载 作者:行者123 更新时间:2023-12-04 18:15:23 25 4
gpt4 key购买 nike

我在 C# 中有一个轮询循环,需要在 上每 100 微秒轮询一次。平均 (当然,考虑到没有因内核短缺而由Windows进行过多的抢占式线程上下文切换)

由于没有时间重新安排,Sleep(1) 不会这样做。

所以我决定专用一个线程(实际上,在设置亲和力时,一个核心)并使用 Thread.SpinWait 为每次迭代的一组周期。虽然这很好用,但它消耗了不必要的电量。 100 微秒足以让 CPU 暂停(但不足以让线程从调度程序中临时删除,因为 Windows 时间片会很长)。

相反,我正在考虑使用 Intel PAUSE 指令,但我不确定它是否会触发 Intel CPU 暂停硬件线程。英特尔声称它可以保存功率并且应该在自旋循环中使用,但由于暂停时间长达 100 微秒,我真的希望内核进入 C1 模式 sleep 。

有任何想法吗?

编辑:我正在轮询第三方 API,因此没有要阻止的同步事件。

最佳答案

自然地,使用同步原语和计时器是避免 CPU/耗电量大的忙等待的首选方法。但是,如果您需要如此频繁地轮询 - 至少在用户模式下,无法通过常规方式实现这一点。

您可以做的一件简单的事情是包含 pause循环中的 CPU 指令。在 MSVC 中,它由内在的 YieldProcessor() 实现。方法。

除此之外 - 可能仅在内核模式编程中。在那里您可以使用高精度多媒体计时器。

编辑:

关于 SetWaitableTimer .这可能是一种选择。与“传统”的 Win32 等待函数(例如 SleepWaitForSingleObject 等)不同,它使用高精度超时作为参数。

然而,用户模式计时器是 异步 在自然界。让我们假设计时器以高精度激活(这并不明显,“传统的”Win32 等待函数精确到刻度量,大约几十毫秒)。计时器激活后 - 它释放适当的等待线程。但是线程调度程序不必立即将此线程附加到执行中——它可能会等待下一个时间片。如果有并发线程,甚至会更多地延迟线程执行。

总之:这个想法似乎值得一试。但是,如果这或多或少等同于使用 Sleep,我不会感到惊讶。 .

关于.net - 省电 SpinWait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com