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