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