changeset 23019:4934af4fdd0f

Collect hit/miss statistic in hash map, and print in -v mode.
author eugeni
date Fri, 20 Apr 2007 23:06:12 +0000
parents a4517aa83565
children 1cce8d37847e
files libass/ass_cache.c
diffstat 1 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libass/ass_cache.c	Fri Apr 20 23:04:21 2007 +0000
+++ b/libass/ass_cache.c	Fri Apr 20 23:06:12 2007 +0000
@@ -46,10 +46,13 @@
 	int nbuckets;
 	size_t key_size, value_size;
 	hashmap_item_p* root;
-	int count;
 	hashmap_item_dtor_t item_dtor; // a destructor for hashmap key/value pairs
 	hashmap_key_compare_t key_compare;
 	hashmap_hash_t hash;
+	// stats
+	int hit_count;
+	int miss_count;
+	int count;
 };
 
 #define FNV1_32A_INIT (unsigned)0x811c9dc5
@@ -98,7 +101,6 @@
 	map->nbuckets = nbuckets;
 	map->key_size = key_size;
 	map->value_size = value_size;
-	map->count = 0;
 	map->root = calloc(nbuckets, sizeof(hashmap_item_p));
 	map->item_dtor = item_dtor ? item_dtor : hashmap_item_dtor;
 	map->key_compare = key_compare ? key_compare : hashmap_key_compare;
@@ -109,6 +111,11 @@
 void hashmap_done(hashmap_t* map)
 {
 	int i;
+	// print stats
+	if (map->count > 0 || map->hit_count + map->miss_count > 0)
+		mp_msg(MSGT_ASS, MSGL_DBG, "cache statistics: \n  total accesses: %d\n  hits: %d\n  misses: %d\n  object count: %d\n",
+		       map->hit_count + map->miss_count, map->hit_count, map->miss_count, map->count);
+	
 	for (i = 0; i < map->nbuckets; ++i) {
 		hashmap_item_t* item = map->root[i];
 		while (item) {
@@ -149,10 +156,12 @@
 	hashmap_item_t* item = map->root[hash % map->nbuckets];
 	while (item) {
 		if (map->key_compare(key, item->key, map->key_size)) {
+			map->hit_count++;
 			return item->value;
 		}
 		item = item->next;
 	}
+	map->miss_count++;
 	return 0;
 }