其他分享
首页 > 其他分享> > 编写一段代码使 CPU 利用率在 50%左右

编写一段代码使 CPU 利用率在 50%左右

作者:互联网

1. CPU 的使用率

  1. 要让 CPU 保持一直使用,即让它一直 取指执行取指执行 才能维持高的 CPU 使用率
 mov         dword ptr [ebp-70h],0  
 jmp         main+0D8h (0E09BC8h)  
 mov         eax,dword ptr [ebp-70h]  
 add         eax,1  
 mov         dword ptr [ebp-70h],eax  
 cmp         dword ptr [ebp-70h],27100h 
  1. 如果 CPU 没有执行 取指执行 的操作,那么 CPU 就不使用,CPU 的使用率就会低,
Sleep(1)

或者

调用 IO 输入输出

但是, IO 操作会调用 system call,导致很多不可控的内核运行时间。

  1. 所以,使用取指执行 使用CPU,使用 Sleep 睡眠函数让 CPU 静止不操作。让两者的操作(很短的时间,比如 10 个微秒)各占一半,那么就可以让 CPU 使用率在 50%

2. 简单的解法

1. Linux 系统

#include <iostream>
#include <vector>
#include <unistd.h>

int main(){
	// 不同的计算机需要修改 900000 这个值
	std::vector<int> v(900000, 0);

	// 取指执行和睡眠的时间各占一半
	while(true) {
		// 取指执行
        for (auto& a : v) {
        }
        // 睡眠 μs
        usleep(10000);
	}
	return 0;
}

chen@chen229:~/xm/scripts> g++ -o main main.cc  -std=c++11
chen@chen229:~/xm/scripts> ./main

在这里插入图片描述

chen@chen229:~> ps -aux | grep main
chen     22659 49.6  0.0  13128  1244 pts/3    S+   14:28   0:35 ./main
chen     22675  0.0  0.0   8312   876 pts/1    S+   14:29   0:00 grep --color=auto main

在这里插入图片描述

3. 比较通用的解法,换了计算机也不用改什么

1. Linux 系统

#include <iostream>
#include <vector>
#include <chrono>

int main() {

	// 记录初始时间
    std::vector<int> v(300000, 5);
	auto startTime = std::chrono::high_resolution_clock::now();

	for (auto& a : v) {

    }

	// 记录结束时间
	auto stopTime = std::chrono::high_resolution_clock::now();
	// 求时间差
	auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stopTime - startTime);

	// 输出时间: μs
	std::cout << "time: " << duration.count() << " microseconds\n";
	
	return 0;
}
lenovo@lenovo-PC MINGW64 /e/zhiyong/5. chenqifeng/2. codes/3. init/1_DebyeGas/temp
$ g++ -o main main.cc -std=c++11

lenovo@lenovo-PC MINGW64 /e/zhiyong/5. chenqifeng/2. codes/3. init/1_DebyeGas/temp
$ ./main.exe
time: 5000 microseconds
#include <iostream>
#include <chrono>
#include <unistd.h>

int main() {

	const int SLEEP_TIME = 10000;
	
    while(true) {
		// 记录初始时间
		auto start = std::chrono::high_resolution_clock::now();
		// 取指执行的时间为 10000 μs
		while(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start).count() < SLEEP_TIME) {
		}
		// 睡眠的时间为 10000 μs
		usleep(SLEEP_TIME);
    }

	return 0;
}

测试:(和上面的一样,我就直接复制下来了)

chen@chen229:~/xm/scripts> g++ -o main main.cc  -std=c++11
chen@chen229:~/xm/scripts> ./main

在这里插入图片描述

chen@chen229:~> ps -aux | grep main
chen     22659 49.6  0.0  13128  1244 pts/3    S+   14:28   0:35 ./main
chen     22675  0.0  0.0   8312   876 pts/1    S+   14:29   0:00 grep --color=auto main

在这里插入图片描述

3. 参考

《编程之美》

标签:std,include,auto,50%,利用率,chen,main,CPU
来源: https://blog.csdn.net/yong1585855343/article/details/116348761