CPU Sin
1 #include <iostream>
2 #include <cmath>
3 #include <ctime>
4 #include <windows.h>
5
6 using namespace std;
7
8 //得到循環0xFFFFFFFF次用的秒數
9 unsigned int test()
10 {
11 unsigned int c = 0xFFFFFFFF;
12
13 time_t t1, t2;
14 time(&t1);
15
16 for(unsigned int i = 0; i < c; i++)
17 ;
18 time(&t2);
19 return (unsigned int)(t2 -t1);
20
21 }
22
23
24 #define T 20000 //周期時間 20秒
25 #define C 100 //采樣點時間間隔
26 #define PI 3.1415 //PI
27 const unsigned int count = 0xFFFFFFFF / (test() *1000); //每秒可以執行的循環數目
28 const unsigned int N = T/C; //周期內采樣點數目
29 unsigned int v[N] = { 0 }; //所有采樣點連續執行循環數
30 unsigned int mt[N] = { 0 }; //所有采樣點休眠毫秒數
31
32 int main()
33 {
34 //計算循環次數和休眠時間
35 for(int i = 0; i < N; i++)
36 {
37 double x = (2 * PI / N)* i ;//2*PI/N 是把2PI的x軸 分成N份,再乘i得到第i個點相對于sin函數的橫坐標
38 double r = (sin(x) + 1) / 2;//將sine函數映射到[0,1],as a coefficient,作為單位時間C內工作的時間比例(y軸0-100%)
39
40 mt[i] = C - r * C;//(1-r)C,在單位時間C應該休息多久, 在當前C 里面工作r*c, 休息(1-r)*C,繪制的一個點。下一個C又繪制一個,y值是sin得來所以看起來近似正選
//rate = work/C -> rate = r -> work = r*c
41 v[i] = r * C * count;//r*C在單位時間C應該工作多久,再*count,得到需要多少個for
42 }
43 for(;;)
44 {
45 for(int i = 0; i < N; i++)
46 {
47 for(int j = 0; j < v[i]; j++)
48 ;
49 Sleep(mt[i]);
50 }
51 }
52 }
總結
- 上一篇: Linux下获取毫秒级时间差
- 下一篇: vim操作全技巧