db_stat.c revision cc2ee177dbb3befca43e36cfc56778b006c3d050
1/** 2 * @file db_stat.c 3 * Statistics routines for libdb 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author Philippe Elie 9 */ 10 11#include <stdlib.h> 12#include <stdio.h> 13 14#include "odb.h" 15 16/// hold various statistics data for a db file 17struct odb_hash_stat_t { 18 odb_node_nr_t node_nr; /**< allocated node number */ 19 odb_node_nr_t used_node_nr; /**< in use node number */ 20 odb_value_t total_count; /**< cumulated samples count */ 21 odb_index_t hash_table_size; /**< hash table entry number */ 22 odb_node_nr_t max_list_length; /**< worst case */ 23 double average_list_length; /**< average case */ 24 /* do we need variance ? */ 25}; 26 27odb_hash_stat_t * odb_hash_stat(odb_t const * odb) 28{ 29 size_t max_length = 0; 30 double total_length = 0.0; 31 size_t nr_non_empty_list = 0; 32 size_t pos; 33 odb_data_t * data = odb->data; 34 35 odb_hash_stat_t * result = calloc(1, sizeof(odb_hash_stat_t)); 36 if (!result) { 37 fprintf(stderr, "not enough memory\n"); 38 exit(EXIT_FAILURE); 39 } 40 41 result->node_nr = data->descr->size; 42 result->used_node_nr = data->descr->current_size; 43 result->hash_table_size = data->descr->size * BUCKET_FACTOR; 44 45 /* FIXME: I'm dubious if this do right statistics for hash table 46 * efficiency check */ 47 48 for (pos = 0 ; pos < result->hash_table_size ; ++pos) { 49 size_t cur_length = 0; 50 size_t index = data->hash_base[pos]; 51 while (index) { 52 result->total_count += data->node_base[index].value; 53 index = data->node_base[index].next; 54 ++cur_length; 55 } 56 57 if (cur_length > max_length) 58 max_length = cur_length; 59 60 if (cur_length) { 61 total_length += cur_length; 62 ++nr_non_empty_list; 63 } 64 } 65 66 result->max_list_length = max_length; 67 result->average_list_length = total_length / nr_non_empty_list; 68 69 return result; 70} 71 72 73void odb_hash_display_stat(odb_hash_stat_t const * stat) 74{ 75 printf("total node number: %d\n", stat->node_nr); 76 printf("total used node: %d\n", stat->used_node_nr); 77 printf("total count: %d\n", stat->total_count); 78 printf("hash table size: %d\n", stat->hash_table_size); 79 printf("greater list length: %d\n", stat->max_list_length); 80 printf("average non empty list length: %2.4f\n", stat->average_list_length); 81} 82 83 84void odb_hash_free_stat(odb_hash_stat_t * stat) 85{ 86 free(stat); 87} 88