xref: /aosp_15_r20/system/extras/app-launcher/computestats.c (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker #include <fcntl.h>
2*288bf522SAndroid Build Coastguard Worker #include <sys/ioctl.h>
3*288bf522SAndroid Build Coastguard Worker #include <stdio.h>
4*288bf522SAndroid Build Coastguard Worker #include <sys/time.h>
5*288bf522SAndroid Build Coastguard Worker #include <sys/types.h>
6*288bf522SAndroid Build Coastguard Worker #include <sys/mman.h>
7*288bf522SAndroid Build Coastguard Worker #include <unistd.h>
8*288bf522SAndroid Build Coastguard Worker #include <stdlib.h>
9*288bf522SAndroid Build Coastguard Worker #include <math.h>
10*288bf522SAndroid Build Coastguard Worker 
11*288bf522SAndroid Build Coastguard Worker char *pname;
12*288bf522SAndroid Build Coastguard Worker char *in_file;
13*288bf522SAndroid Build Coastguard Worker 
14*288bf522SAndroid Build Coastguard Worker #define DATA_COUNT	(1024*1024)
15*288bf522SAndroid Build Coastguard Worker u_int64_t data_items[DATA_COUNT];
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker int num_data_items = 0;
18*288bf522SAndroid Build Coastguard Worker 
19*288bf522SAndroid Build Coastguard Worker #define BUFSIZE		1024
20*288bf522SAndroid Build Coastguard Worker char in_buf[BUFSIZE];
21*288bf522SAndroid Build Coastguard Worker 
22*288bf522SAndroid Build Coastguard Worker static int
compare_long(const void * p1,const void * p2)23*288bf522SAndroid Build Coastguard Worker compare_long(const void *p1, const void *p2)
24*288bf522SAndroid Build Coastguard Worker {
25*288bf522SAndroid Build Coastguard Worker 	u_int64_t val1 = *(u_int64_t *)p1;
26*288bf522SAndroid Build Coastguard Worker 	u_int64_t val2 = *(u_int64_t *)p2;
27*288bf522SAndroid Build Coastguard Worker 
28*288bf522SAndroid Build Coastguard Worker 	if (val1 == val2)
29*288bf522SAndroid Build Coastguard Worker 		return 0;
30*288bf522SAndroid Build Coastguard Worker 	if (val1 < val2)
31*288bf522SAndroid Build Coastguard Worker 		return -1;
32*288bf522SAndroid Build Coastguard Worker 	return 1;
33*288bf522SAndroid Build Coastguard Worker }
34*288bf522SAndroid Build Coastguard Worker 
35*288bf522SAndroid Build Coastguard Worker int
main(int argc,char ** argv)36*288bf522SAndroid Build Coastguard Worker main(int argc, char **argv)
37*288bf522SAndroid Build Coastguard Worker {
38*288bf522SAndroid Build Coastguard Worker 	FILE *in_fp;
39*288bf522SAndroid Build Coastguard Worker 	u_int64_t sum_x = 0;
40*288bf522SAndroid Build Coastguard Worker 	u_int64_t sum_sq_x = 0;
41*288bf522SAndroid Build Coastguard Worker 	u_int64_t mean;
42*288bf522SAndroid Build Coastguard Worker 	double std_dev;
43*288bf522SAndroid Build Coastguard Worker 	int i;
44*288bf522SAndroid Build Coastguard Worker 	int one_sd = 0;
45*288bf522SAndroid Build Coastguard Worker 	int two_sd = 0;
46*288bf522SAndroid Build Coastguard Worker 	int three_sd = 0;
47*288bf522SAndroid Build Coastguard Worker 	double one_sd_low, one_sd_high;
48*288bf522SAndroid Build Coastguard Worker 	double two_sd_low, two_sd_high;
49*288bf522SAndroid Build Coastguard Worker 	double three_sd_low, three_sd_high;
50*288bf522SAndroid Build Coastguard Worker 
51*288bf522SAndroid Build Coastguard Worker 	pname = argv[0];
52*288bf522SAndroid Build Coastguard Worker 	if (argc == 1)
53*288bf522SAndroid Build Coastguard Worker 		in_fp = stdin;
54*288bf522SAndroid Build Coastguard Worker 	else {
55*288bf522SAndroid Build Coastguard Worker 		in_file = argv[1];
56*288bf522SAndroid Build Coastguard Worker 		in_fp = fopen(in_file, "r");
57*288bf522SAndroid Build Coastguard Worker 	}
58*288bf522SAndroid Build Coastguard Worker 	while (fgets(in_buf, BUFSIZE, in_fp)) {
59*288bf522SAndroid Build Coastguard Worker 		if (num_data_items == DATA_COUNT) {
60*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr,
61*288bf522SAndroid Build Coastguard Worker 				"DATA overflow, increase size of data_items array\n");
62*288bf522SAndroid Build Coastguard Worker 			exit(1);
63*288bf522SAndroid Build Coastguard Worker 		}
64*288bf522SAndroid Build Coastguard Worker 		sscanf(in_buf, "%ju", &data_items[num_data_items]);
65*288bf522SAndroid Build Coastguard Worker #if 0
66*288bf522SAndroid Build Coastguard Worker 		printf("%lu\n", data_items[num_data_items++]);
67*288bf522SAndroid Build Coastguard Worker #endif
68*288bf522SAndroid Build Coastguard Worker 		num_data_items++;
69*288bf522SAndroid Build Coastguard Worker 	}
70*288bf522SAndroid Build Coastguard Worker 	if (num_data_items == 0) {
71*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "Empty input file ?\n");
72*288bf522SAndroid Build Coastguard Worker 		exit(1);
73*288bf522SAndroid Build Coastguard Worker 	}
74*288bf522SAndroid Build Coastguard Worker #if 0
75*288bf522SAndroid Build Coastguard Worker 	printf("Total items %lu\n", num_data_items);
76*288bf522SAndroid Build Coastguard Worker #endif
77*288bf522SAndroid Build Coastguard Worker 	for (i = 0 ; i < num_data_items ; i++) {
78*288bf522SAndroid Build Coastguard Worker 		sum_x += data_items[i];
79*288bf522SAndroid Build Coastguard Worker 		sum_sq_x += data_items[i] * data_items[i];
80*288bf522SAndroid Build Coastguard Worker 	}
81*288bf522SAndroid Build Coastguard Worker 	mean = sum_x / num_data_items;
82*288bf522SAndroid Build Coastguard Worker 	printf("\tMean %lu\n", mean);
83*288bf522SAndroid Build Coastguard Worker 	std_dev = sqrt((sum_sq_x / num_data_items) - (mean * mean));
84*288bf522SAndroid Build Coastguard Worker 	printf("\tStd Dev %.2f (%.2f%% of mean)\n",
85*288bf522SAndroid Build Coastguard Worker 	       std_dev, (std_dev * 100.0) / mean);
86*288bf522SAndroid Build Coastguard Worker 	one_sd_low = mean - std_dev;
87*288bf522SAndroid Build Coastguard Worker 	one_sd_high = mean + std_dev;
88*288bf522SAndroid Build Coastguard Worker 	two_sd_low = mean - (2 * std_dev);
89*288bf522SAndroid Build Coastguard Worker 	two_sd_high = mean + (2 * std_dev);
90*288bf522SAndroid Build Coastguard Worker 	three_sd_low = mean - (3 * std_dev);
91*288bf522SAndroid Build Coastguard Worker 	three_sd_high = mean + (3 * std_dev);
92*288bf522SAndroid Build Coastguard Worker 	for (i = 0 ; i < num_data_items ; i++) {
93*288bf522SAndroid Build Coastguard Worker 		if (data_items[i] >= one_sd_low &&
94*288bf522SAndroid Build Coastguard Worker 		    data_items[i] <= one_sd_high)
95*288bf522SAndroid Build Coastguard Worker 			one_sd++;
96*288bf522SAndroid Build Coastguard Worker 		if (data_items[i] >= two_sd_low &&
97*288bf522SAndroid Build Coastguard Worker 		    data_items[i] <= two_sd_high)
98*288bf522SAndroid Build Coastguard Worker 			two_sd++;
99*288bf522SAndroid Build Coastguard Worker 		if (data_items[i] >= three_sd_low &&
100*288bf522SAndroid Build Coastguard Worker 			 data_items[i] <= three_sd_high)
101*288bf522SAndroid Build Coastguard Worker 			three_sd++;
102*288bf522SAndroid Build Coastguard Worker 	}
103*288bf522SAndroid Build Coastguard Worker 	printf("\tWithin 1 SD %.2f%%\n",
104*288bf522SAndroid Build Coastguard Worker 	       ((double)one_sd * 100) / num_data_items);
105*288bf522SAndroid Build Coastguard Worker 	printf("\tWithin 2 SD %.2f%%\n",
106*288bf522SAndroid Build Coastguard Worker 	       ((double)two_sd * 100) / num_data_items);
107*288bf522SAndroid Build Coastguard Worker 	printf("\tWithin 3 SD %.2f%%\n",
108*288bf522SAndroid Build Coastguard Worker 	       ((double)three_sd* 100) / num_data_items);
109*288bf522SAndroid Build Coastguard Worker 	printf("\tOutside 3 SD %.2f%%\n",
110*288bf522SAndroid Build Coastguard Worker 	       ((double)(num_data_items - three_sd) * 100) / num_data_items);
111*288bf522SAndroid Build Coastguard Worker 	/* Sort the data to get percentiles */
112*288bf522SAndroid Build Coastguard Worker 	qsort(data_items, num_data_items, sizeof(u_int64_t), compare_long);
113*288bf522SAndroid Build Coastguard Worker 	printf("\t50th percentile %lu\n", data_items[num_data_items / 2]);
114*288bf522SAndroid Build Coastguard Worker 	printf("\t75th percentile %lu\n", data_items[(3 * num_data_items) / 4]);
115*288bf522SAndroid Build Coastguard Worker 	printf("\t90th percentile %lu\n", data_items[(9 * num_data_items) / 10]);
116*288bf522SAndroid Build Coastguard Worker 	printf("\t99th percentile %lu\n", data_items[(99 * num_data_items) / 100]);
117*288bf522SAndroid Build Coastguard Worker }
118*288bf522SAndroid Build Coastguard Worker 
119