編寫一段程式碼使 CPU 利用率在 50%左右
阿新 • • 發佈:2021-05-04
1. CPU 的使用率
- 要讓 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
- 如果 CPU 沒有執行
取指執行
的操作,那麼 CPU 就不使用,CPU 的使用率就會低,
- 比如:
Sleep(1)
或者
呼叫 IO 輸入輸出
但是, IO
操作會呼叫 system call
,導致很多不可控的核心執行時間。
- 所以,使用
取指執行
使用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. 參考
《程式設計之美》