1. 程式人生 > 其它 >編寫一段程式碼使 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;
}

  • 編譯執行
[email protected]:~/xm/scripts> g++ -o main main.cc  -std=c++11
[email protected]:~/xm/scripts> ./main

在這裡插入圖片描述

  • 檢視 CPU 使用率
[email protected]:~> 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

在這裡插入圖片描述

  • 可以看到在CPU 使用率 49.6%
    在這裡插入圖片描述

3. 比較通用的解法,換了計算機也不用改什麼

1. Linux 系統

  • 首先先看一下 C++11 標準庫的 <chrono> 的使用
#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;
}
  • 執行
[email protected] MINGW64 /e/zhiyong/5. chenqifeng/2. codes/3. init/1_DebyeGas/temp
$ g++ -o main main.cc -std=c++11

[email protected] 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;
}

測試:(和上面的一樣,我就直接複製下來了)

  • 編譯執行
[email protected]:~/xm/scripts> g++ -o main main.cc  -std=c++11
[email protected]:~/xm/scripts> ./main

在這裡插入圖片描述

  • 檢視 CPU 使用率
[email protected]:~> 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

在這裡插入圖片描述

  • 可以看到在CPU 使用率 49.6%
    在這裡插入圖片描述

3. 參考

《程式設計之美》