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 }