1b7579f77SDag-Erling Smørgrav /* 2b7579f77SDag-Erling Smørgrav * util/timehist.h - make histogram of time values. 3b7579f77SDag-Erling Smørgrav * 4b7579f77SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5b7579f77SDag-Erling Smørgrav * 6b7579f77SDag-Erling Smørgrav * This software is open source. 7b7579f77SDag-Erling Smørgrav * 8b7579f77SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9b7579f77SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10b7579f77SDag-Erling Smørgrav * are met: 11b7579f77SDag-Erling Smørgrav * 12b7579f77SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14b7579f77SDag-Erling Smørgrav * 15b7579f77SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17b7579f77SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18b7579f77SDag-Erling Smørgrav * 19b7579f77SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20b7579f77SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21b7579f77SDag-Erling Smørgrav * specific prior written permission. 22b7579f77SDag-Erling Smørgrav * 23b7579f77SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2417d15b25SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2517d15b25SDag-Erling Smørgrav * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2617d15b25SDag-Erling Smørgrav * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2717d15b25SDag-Erling Smørgrav * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2817d15b25SDag-Erling Smørgrav * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2917d15b25SDag-Erling Smørgrav * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 3017d15b25SDag-Erling Smørgrav * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3117d15b25SDag-Erling Smørgrav * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3217d15b25SDag-Erling Smørgrav * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3317d15b25SDag-Erling Smørgrav * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34b7579f77SDag-Erling Smørgrav */ 35b7579f77SDag-Erling Smørgrav 36b7579f77SDag-Erling Smørgrav /** 37b7579f77SDag-Erling Smørgrav * \file 38b7579f77SDag-Erling Smørgrav * 39b7579f77SDag-Erling Smørgrav * This file contains functions to make a histogram of time values. 40b7579f77SDag-Erling Smørgrav */ 41b7579f77SDag-Erling Smørgrav 42b7579f77SDag-Erling Smørgrav #ifndef UTIL_TIMEHIST_H 43b7579f77SDag-Erling Smørgrav #define UTIL_TIMEHIST_H 44b7579f77SDag-Erling Smørgrav 45b7579f77SDag-Erling Smørgrav /** Number of buckets in a histogram */ 46b7579f77SDag-Erling Smørgrav #define NUM_BUCKETS_HIST 40 47b7579f77SDag-Erling Smørgrav 48b7579f77SDag-Erling Smørgrav /** 49b7579f77SDag-Erling Smørgrav * Bucket of time history information 50b7579f77SDag-Erling Smørgrav */ 51b7579f77SDag-Erling Smørgrav struct th_buck { 52b7579f77SDag-Erling Smørgrav /** lower bound */ 53b7579f77SDag-Erling Smørgrav struct timeval lower; 54b7579f77SDag-Erling Smørgrav /** upper bound */ 55b7579f77SDag-Erling Smørgrav struct timeval upper; 56b7579f77SDag-Erling Smørgrav /** number of items */ 57b7579f77SDag-Erling Smørgrav size_t count; 58b7579f77SDag-Erling Smørgrav }; 59b7579f77SDag-Erling Smørgrav 60b7579f77SDag-Erling Smørgrav /** 61b7579f77SDag-Erling Smørgrav * Keep histogram of time values. 62b7579f77SDag-Erling Smørgrav */ 63b7579f77SDag-Erling Smørgrav struct timehist { 64b7579f77SDag-Erling Smørgrav /** number of buckets */ 65b7579f77SDag-Erling Smørgrav size_t num; 66b7579f77SDag-Erling Smørgrav /** bucket array */ 67b7579f77SDag-Erling Smørgrav struct th_buck* buckets; 68b7579f77SDag-Erling Smørgrav }; 69b7579f77SDag-Erling Smørgrav 70b7579f77SDag-Erling Smørgrav /** 71b7579f77SDag-Erling Smørgrav * Setup a histogram, default 72b7579f77SDag-Erling Smørgrav * @return histogram or NULL on malloc failure. 73b7579f77SDag-Erling Smørgrav */ 74b7579f77SDag-Erling Smørgrav struct timehist* timehist_setup(void); 75b7579f77SDag-Erling Smørgrav 76b7579f77SDag-Erling Smørgrav /** 77b7579f77SDag-Erling Smørgrav * Delete histogram 78b7579f77SDag-Erling Smørgrav * @param hist: to delete 79b7579f77SDag-Erling Smørgrav */ 80b7579f77SDag-Erling Smørgrav void timehist_delete(struct timehist* hist); 81b7579f77SDag-Erling Smørgrav 82b7579f77SDag-Erling Smørgrav /** 83b7579f77SDag-Erling Smørgrav * Clear histogram 84b7579f77SDag-Erling Smørgrav * @param hist: to clear all data from 85b7579f77SDag-Erling Smørgrav */ 86b7579f77SDag-Erling Smørgrav void timehist_clear(struct timehist* hist); 87b7579f77SDag-Erling Smørgrav 88b7579f77SDag-Erling Smørgrav /** 89b7579f77SDag-Erling Smørgrav * Add time value to histogram. 90b7579f77SDag-Erling Smørgrav * @param hist: histogram 91b7579f77SDag-Erling Smørgrav * @param tv: time value 92b7579f77SDag-Erling Smørgrav */ 93b7579f77SDag-Erling Smørgrav void timehist_insert(struct timehist* hist, struct timeval* tv); 94b7579f77SDag-Erling Smørgrav 95b7579f77SDag-Erling Smørgrav /** 96b7579f77SDag-Erling Smørgrav * Find time value for given quartile, such as 0.25, 0.50, 0.75. 97b7579f77SDag-Erling Smørgrav * The looks up the value for the i-th element in the sorted list of time 98b7579f77SDag-Erling Smørgrav * values, as approximated using the histogram. 99b7579f77SDag-Erling Smørgrav * @param hist: histogram. Interpolated information is used from it. 100b7579f77SDag-Erling Smørgrav * @param q: quartile, 0.50 results in the median. Must be >0 and <1. 101b7579f77SDag-Erling Smørgrav * @return: the time in seconds for that percentage. 102b7579f77SDag-Erling Smørgrav */ 103b7579f77SDag-Erling Smørgrav double timehist_quartile(struct timehist* hist, double q); 104b7579f77SDag-Erling Smørgrav 105b7579f77SDag-Erling Smørgrav /** 106b7579f77SDag-Erling Smørgrav * Printout histogram 107b7579f77SDag-Erling Smørgrav * @param hist: histogram 108b7579f77SDag-Erling Smørgrav */ 109b7579f77SDag-Erling Smørgrav void timehist_print(struct timehist* hist); 110b7579f77SDag-Erling Smørgrav 111b7579f77SDag-Erling Smørgrav /** 112b7579f77SDag-Erling Smørgrav * Log histogram, print it to the logfile. 113b7579f77SDag-Erling Smørgrav * @param hist: histogram 114b7579f77SDag-Erling Smørgrav * @param name: the name of the value column 115b7579f77SDag-Erling Smørgrav */ 116b7579f77SDag-Erling Smørgrav void timehist_log(struct timehist* hist, const char* name); 117b7579f77SDag-Erling Smørgrav 118b7579f77SDag-Erling Smørgrav /** 119b7579f77SDag-Erling Smørgrav * Export histogram to an array. 120b7579f77SDag-Erling Smørgrav * @param hist: histogram 121b7579f77SDag-Erling Smørgrav * @param array: the array to export to. 122b7579f77SDag-Erling Smørgrav * @param sz: number of items in array. 123b7579f77SDag-Erling Smørgrav */ 124*c7f4d7adSDag-Erling Smørgrav void timehist_export(struct timehist* hist, long long* array, size_t sz); 125b7579f77SDag-Erling Smørgrav 126b7579f77SDag-Erling Smørgrav /** 127b7579f77SDag-Erling Smørgrav * Import histogram from an array. 128b7579f77SDag-Erling Smørgrav * @param hist: histogram 129b7579f77SDag-Erling Smørgrav * @param array: the array to import from. 130b7579f77SDag-Erling Smørgrav * @param sz: number of items in array. 131b7579f77SDag-Erling Smørgrav */ 132*c7f4d7adSDag-Erling Smørgrav void timehist_import(struct timehist* hist, long long* array, size_t sz); 133b7579f77SDag-Erling Smørgrav 134b7579f77SDag-Erling Smørgrav #endif /* UTIL_TIMEHIST_H */ 135