A* path and neighbor cache performance statistics
as_clear_cachepath() now prints cache hits, misses, number of entries, and memory use to stderr, when compiled with AS_STATS defined.
This commit is contained in:
parent
8f92fe40f4
commit
2797e58c20
2 changed files with 43 additions and 1 deletions
|
@ -58,6 +58,15 @@ static struct as_frompath **fromhead = (struct as_frompath **)0;
|
||||||
|
|
||||||
static int as_cachepath_on = 0; /* Default to off */
|
static int as_cachepath_on = 0; /* Default to off */
|
||||||
|
|
||||||
|
#ifdef AS_STATS
|
||||||
|
unsigned as_cache_tries, as_cache_hits;
|
||||||
|
#define as_cache_try() ((void)as_cache_tries++)
|
||||||
|
#define as_cache_hit() ((void)as_cache_hits++)
|
||||||
|
#else
|
||||||
|
#define as_cache_try() ((void)0)
|
||||||
|
#define as_cache_hit() ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
as_enable_cachepath(void)
|
as_enable_cachepath(void)
|
||||||
{
|
{
|
||||||
|
@ -142,6 +151,13 @@ as_clear_cachepath(void)
|
||||||
struct as_frompath *from, *from2;
|
struct as_frompath *from, *from2;
|
||||||
struct as_topath *to, *to2;
|
struct as_topath *to, *to2;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
#ifdef AS_STATS
|
||||||
|
size_t index_sz = 0;
|
||||||
|
unsigned index_nb = 0, paths_nb = 0, paths = 0;
|
||||||
|
#define stats_index(sz) ((void)(index_sz += (sz), index_nb++))
|
||||||
|
#else
|
||||||
|
#define stats_index(sz) ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Cache not used yet :) */
|
/* Cache not used yet :) */
|
||||||
if (fromhead == NULL)
|
if (fromhead == NULL)
|
||||||
|
@ -153,22 +169,43 @@ as_clear_cachepath(void)
|
||||||
for (to = from->tolist[i]; to; to = to2) {
|
for (to = from->tolist[i]; to; to = to2) {
|
||||||
to2 = to->next;
|
to2 = to->next;
|
||||||
/* Free this path */
|
/* Free this path */
|
||||||
|
#ifdef AS_STATS
|
||||||
|
{
|
||||||
|
struct as_path *pp;
|
||||||
|
for (pp = to->path; pp; pp = pp->next)
|
||||||
|
paths_nb++;
|
||||||
|
paths++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
as_free_path(to->path);
|
as_free_path(to->path);
|
||||||
/* Free this node */
|
/* Free this node */
|
||||||
free(to);
|
free(to);
|
||||||
|
stats_index(sizeof(*to));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Now, free the list of lists */
|
/* Now, free the list of lists */
|
||||||
free(from->tolist);
|
free(from->tolist);
|
||||||
|
stats_index(WORLD_Y * sizeof(*from->tolist));
|
||||||
/* Save the next pointer */
|
/* Save the next pointer */
|
||||||
from2 = from->next;
|
from2 = from->next;
|
||||||
/* now, free this from node */
|
/* now, free this from node */
|
||||||
free(from);
|
free(from);
|
||||||
|
stats_index(sizeof(*from));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Note we don't free the fromhead here, we just zero it. That way,
|
/* Note we don't free the fromhead here, we just zero it. That way,
|
||||||
we can use it next time without mallocing int */
|
we can use it next time without mallocing int */
|
||||||
memset(fromhead, 0, (sizeof(struct as_frompath *) * WORLD_Y));
|
memset(fromhead, 0, (sizeof(struct as_frompath *) * WORLD_Y));
|
||||||
|
stats_index(WORLD_Y * sizeof(*fromhead));
|
||||||
|
#ifdef AS_STATS
|
||||||
|
fprintf(stderr, "as_cache %u searches, %u hits, %u entries,"
|
||||||
|
" index %zu bytes %u blocks, paths %zu bytes %u blocks\n",
|
||||||
|
as_cache_tries, as_cache_hits,
|
||||||
|
paths,
|
||||||
|
index_sz, index_nb,
|
||||||
|
paths_nb * sizeof(struct as_path), paths_nb);
|
||||||
|
as_cache_hits = as_cache_tries = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct as_path *
|
struct as_path *
|
||||||
|
@ -177,6 +214,7 @@ as_find_cachepath(coord fx, coord fy, coord tx, coord ty)
|
||||||
struct as_frompath *from;
|
struct as_frompath *from;
|
||||||
struct as_topath *to;
|
struct as_topath *to;
|
||||||
|
|
||||||
|
as_cache_try();
|
||||||
/* Is the cache on? if not, return NULL */
|
/* Is the cache on? if not, return NULL */
|
||||||
if (as_cachepath_on == 0)
|
if (as_cachepath_on == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -189,10 +227,12 @@ as_find_cachepath(coord fx, coord fy, coord tx, coord ty)
|
||||||
for (from = fromhead[fy]; from; from = from->next) {
|
for (from = fromhead[fy]; from; from = from->next) {
|
||||||
if (from->x == fx) {
|
if (from->x == fx) {
|
||||||
for (to = from->tolist[ty]; to; to = to->next) {
|
for (to = from->tolist[ty]; to; to = to->next) {
|
||||||
if (to->x == tx)
|
if (to->x == tx) {
|
||||||
|
as_cache_hit();
|
||||||
return to->path;
|
return to->path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,8 @@ best_path(struct sctstr *from, struct sctstr *to, char *path, int mob_type)
|
||||||
|
|
||||||
#ifdef AS_STATS
|
#ifdef AS_STATS
|
||||||
as_stats(adp, stderr);
|
as_stats(adp, stderr);
|
||||||
|
fprintf(stderr, "neighbor cache %zu bytes\n",
|
||||||
|
WORLD_SZ() * 6 * sizeof(struct sctstr *));
|
||||||
#endif /* AS_STATS */
|
#endif /* AS_STATS */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue