c# - 模拟稳定的 CPU 负载和峰值

标签 c# cpu-usage

如何在 C# 中生成稳定的 CPU 负载,在特定时间内低于 100%?我还希望能够在一段时间后更改负载量。您建议如何在很短的时间内产生使用高峰?

最佳答案

首先,您必须了解 CPU 使用率始终是特定时间段内的平均值。在任何给定时间,CPU 要么工作要么不工作。 CPU 永远不会使用 40%。

但是,我们可以通过让 CPU 工作 0.4 秒并休眠 0.6 秒来模拟 40% 的负载超过一秒。这使得那一秒的平均利用率为 40%。

将它减少到小于一秒,比如 100 毫秒的 block 应该会提供更稳定的利用率。

以下方法将采用所需利用率的参数,然后将单个 CPU/核心利用率提高到该程度:

public static void ConsumeCPU(int percentage)
{
    if (percentage < 0 || percentage > 100)
        throw new ArgumentException("percentage");
    Stopwatch watch = new Stopwatch();
    watch.Start();            
    while (true)
    {
        // Make the loop go on for "percentage" milliseconds then sleep the 
        // remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms
        if (watch.ElapsedMilliseconds > percentage)
        {
            Thread.Sleep(100 - percentage);
            watch.Reset();
            watch.Start();
        }
    }
}

我正在使用 stopwatch在这里是因为它比 TickCount 更准确属性,但您同样可以使用它并使用减法来检查您是否运行了足够长的时间。

要记住两点:

  • 在多核系统上,您必须为每个核心生成一个线程。否则,您将看到只有一个 CPU/内核正在运行,给出大致的“百分比/内核数”利用率。
  • Thread.Sleep 不是很准确。它永远不会保证时间精确到毫秒,因此您会看到结果有些变化

要回答您的第二个问题,关于在特定时间后更改利用率,我建议您在一个或多个线程(取决于核心数量)上运行此方法,然后当您想要更改利用率时,您只需停止这些线程并使用新的百分比值生成新的。这样,您不必实现线程通信来更改正在运行的线程的 percentage

关于c# - 模拟稳定的 CPU 负载和峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514544/

相关文章:

c# - 可以 react native 应用程序显示在浏览器中

c# - 如何从 txt 文件中正确读取瑞典语字符

c# - Entity Framework 查询多对多关系

python-2.7 - 限制python多处理中的总CPU使用率

c++ - 每个进程的CPU使用率

python - 了解 multiprocessing 模块的 cpu 核心的使用

android - 是否可以测量应用程序使用的 "CPU time"?

c++ - 在 WinCE 中确定 CPU 使用率

c# - ObservableCollection(T).CollectionChanged 事件

c# - GetHashCode 已实现,但 Dictionary 无法找到 key ?