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