一,cpu使用率計算代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/time.h>
#include <sys/param.h>
#include <pthread.h>
pid_t g_nPid = 0;
static double getCpuUse(int nDiffTime)
{
char stat;
char cName[64] = {0};
pid_t nPid = getpid();
char cBuf[64] = {0};
if(g_nPid > 0)
sprintf(cBuf,"/proc/%d/stat",g_nPid);
else
sprintf(cBuf,"/proc/%d/stat",nPid);
FILE* fid = fopen(cBuf,"r");
unsigned long cStat[42] = {0};
if(fid)
{
fscanf(fid,"%lu %s %c %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
&cStat[0],cName,&stat,&cStat[3],&cStat[4],&cStat[5],&cStat[6],&cStat[7],
&cStat[8],&cStat[9],&cStat[10],&cStat[11],&cStat[12],&cStat[13],&cStat[14],&cStat[15],
&cStat[16],&cStat[17],&cStat[18],&cStat[19],&cStat[20],&cStat[21],&cStat[22],&cStat[23],
&cStat[24],&cStat[25],&cStat[26],&cStat[27],&cStat[28],&cStat[29],&cStat[30],
&cStat[31],&cStat[32],&cStat[33],&cStat[34],&cStat[35],&cStat[36],&cStat[37],
&cStat[38],&cStat[39],&cStat[40],&cStat[41]);
fclose(fid);
}
struct timeval curTime;
gettimeofday(&curTime,NULL);
double lastTime = (double)(curTime.tv_sec * 1000* 1000 + curTime.tv_usec)/1000.0;
unsigned long nLastUt = cStat[13];
unsigned long nLastSt = cStat[14];
unsigned long nLastCut = cStat[15];
unsigned long nLastCst = cStat[16];
sleep(nDiffTime);
fid = fopen(cBuf,"r");
cStat[13] =cStat[14] =cStat[15]= cStat[16]=0;
if(fid)
{
fscanf(fid,"%lu %s %c %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %ld %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
&cStat[0],cName,&stat,&cStat[3],&cStat[4],&cStat[5],&cStat[6],&cStat[7],
&cStat[8],&cStat[9],&cStat[10],&cStat[11],&cStat[12],&cStat[13],&cStat[14],&cStat[15],
&cStat[16],&cStat[17],&cStat[18],&cStat[19],&cStat[20],&cStat[21],&cStat[22],&cStat[23],
&cStat[24],&cStat[25],&cStat[26],&cStat[27],&cStat[28],&cStat[29],&cStat[30],
&cStat[31],&cStat[32],&cStat[33],&cStat[34],&cStat[35],&cStat[36],&cStat[37],
&cStat[38],&cStat[39],&cStat[40],&cStat[41]);
fclose(fid);
}
unsigned long nUt = cStat[13];
unsigned long nSt = cStat[14];
unsigned long nCut = cStat[15];
unsigned long nCst = cStat[16];
gettimeofday(&curTime,NULL);
double thisTime = (curTime.tv_sec * 1000* 1000 + curTime.tv_usec)/1000.0;
double nCpu = (nUt - nLastUt + nSt - nLastSt + nCut - nLastCut + nCst - nLastCst) *1000.0/HZ;
double dTime = thisTime - lastTime;
// printf("=============nCpu = %lf========\n", nCpu);
// printf("=============time = %lf========\n", thisTime - lastTime);
double dCpu = nCpu *100.0/dTime;
return dCpu;
}
void *show(void *ignored)
{
while(1)
{
//printstats();
//rf_driver_stat();
printf("============Current cpu is %lf ============\n", getCpuUse(3));
// sleep(1);
}
}
int main(int argc, char* argv[])
{
if(argc < 2){
printf("Usage: ./main pid");
return 1;
}
int cnt = atoi(argv[1]);
g_nPid = cnt;
int i = 0;
pthread_t pid;
pthread_create(&pid, NULL, show, NULL);
while(1)
{
if( i == 10000)
{
i = 0;
if(g_nPid > 0)
{
sleep(1);
}
}
i++;
}
return 0;
}
二,用gnuplot做曲線圖,纔看某程序修改前後的cup使用率變化圖
1, a.plot文件內容:
set xrange [0:90]
set term png truecolor size 800, 600
set output "yhl.png"
set datafile separator ' '
set style data lines
set xlabel "numbers"
set ylabel "cpu use"
set title " cpu use compare"
set grid
plot 'aaa.txt' using 1:2 title "Zero Copy", 'aaa.txt' using 1:3 title "No Zero Copy"
2,數據文件內容: aaa.txt
0 17.322859 31.325126
1 14.661999 46.305164
2 14.658394 42.987247
3 15.662239 43.654618
4 16.327951 38.323586
5 13.658867 37.654818
6 15.327519 51.970186
7 27.318290 34.322567
8 19.660762 41.987488
9 26.992343 45.652986
10 26.326743 59.982205
11 25.325668 54.651109
12 26.316438 56.315068
13 26.326989 58.966566
14 25.993095 50.984484
15 26.991624 59.983644
16 26.992820 72.979444
17 47.304840 54.650108
18 27.989690 56.966143
19 26.984664 52.983134
20 27.659558 54.966416
21 26.326085 49.983755
22 24.990437 54.984879
23 24.995134 55.317623
24 26.650614 50.316343
25 26.991857 52.970178
26 25.984228 73.974035
27 44.982817 52.636348
28 26.319139 49.984105
29 25.983336 58.649052
30 26.989789 57.296969
31 25.987058 54.652512
32 26.657550 50.635695
33 26.983621 53.315899
34 26.658944 53.985622
35 27.989989 48.320496
36 26.986372 72.975991
37 42.988021 51.635427
38 24.992694 53.317534
39 24.992028 50.303269
40 28.325431 52.316557
41 26.658820 59.316448
42 26.326252 51.318947
43 24.651457 53.318049
44 25.325693 54.300427
45 26.325506 59.979487
46 25.992220 72.627472
47 42.655548 50.652349
48 26.983756 51.652806
49 26.992550 48.302838
50 26.318490 55.982981
51 26.990248 60.315279
52 25.652583 66.979303
53 24.325784 56.984614
54 25.991847 52.650047
55 25.983968 64.316182
56 26.992046 65.958732
57 43.321463 75.980194
58 24.659441 74.313368
59 25.326369 62.645639
60 25.658046 56.652787
61 26.659247 56.297791
62 25.651267 70.649099
63 26.658571 53.632485
64 25.660004 56.650786
65 25.657866 56.650144
66 26.326225 76.976856
67 41.973724 56.651937
68 25.326132 54.298401
69 25.651472 60.983189
70 25.659140 52.967354
71 27.325409 67.645516
72 26.323181 59.318464
73 24.321473 58.648017
74 25.316953 57.651389
75 26.325269 50.632051
76 26.984646 74.982079
77 45.319390 53.984578
78 26.657799 59.313602
79 24.652804 58.317549
80 25.326495 56.963486
81 26.658180 56.317095
82 27.324753 55.964388
83 25.992869 60.982681
84 26.325646 54.984110
85 25.659636 56.982165
86 26.315860 74.647905
87 43.988622 60.628753
88 23.992306 33.324525
1, 安裝gnuplot後,運行命令: gnuplot a.plot