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 }

猜你喜欢

转载自vergilwang.iteye.com/blog/2011326
cpu