如何一致占用80%的CPU?

sho*_*osh 16 cpu performance unit-testing

我正在寻找一种方法,以一致的方式占用单个CPU的80%(或任何其他数量).
我需要这个用于测试在特定CPU利用率条件下触发的组件的单元测试.
为此,我可以假设机器处于空闲状态.

什么是强大的,可能是独立于操作系统的方法呢?

And*_*w C 15

没有80%的时间占用CPU.CPU始终处于使用状态或空闲状态.在一段时间内,您可以将平均使用率提高到80%.是否有一个特定的时间段你希望它被平均?这个伪代码应该可以跨平台工作,超过1秒的CPU使用率为80%:

while True:
    startTime = time.now()
    while date.now() - startTime < 0.8:
        Math.factorial(100) // Or any other computation here
    time.sleep(0.2)
Run Code Online (Sandbox Code Playgroud)

  • 这也称为占空比控制或脉冲宽度调制.打开CPU 80%的时间,并关闭20%的时间.如果粒度足够小,您将获得'80%利用率'.我还建议OP测试他们的组件具有更多的可变负载(例如,编写一个使用上述技术进行10%负载的进程,然后运行其中的8个).这样,您可以获得更多可能模拟读取条件的随机性. (3认同)

Chr*_*odd 5

编写一个交替旋转和休眠以获得您想要的任何特定负载级别的程序非常容易.我在几分钟内把它扔在一起:

#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>

#define INTERVAL    500000
volatile sig_atomic_t   flag;
void setflag(int sig) { flag = 1; }

int main(int ac, char **av) {
    int load = 80;
    struct sigaction sigact;
    struct itimerval interval = { { 0, INTERVAL }, { 0, INTERVAL } };
    struct timespec pausetime = { 0, 0 };
    memset(&sigact, 0, sizeof(sigact));
    sigact.sa_handler = setflag;
    sigaction(SIGALRM, &sigact, 0);
    setitimer(ITIMER_REAL, &interval, 0);
    if (ac == 2) load = atoi(av[1]);
    pausetime.tv_nsec = INTERVAL*(100 - load)*10;
    while (1) {
        flag = 0;
        nanosleep(&pausetime, 0);
        while (!flag) { /* spin */ } }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)