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