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