X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftools%2Fspeed.c;fp=ccan%2Ftdb2%2Ftools%2Fspeed.c;h=7a100d0adffce59468052aaa8ce9a22244d1280f;hp=84dff9968f795a362ac3ee70eecef6db2706da6d;hb=fe55330a60e4e14ea6cac2ff40d50eddca4cf140;hpb=a5b66d7072af7dd5c17c1f4b1ede85f5cd4b7ca3 diff --git a/ccan/tdb2/tools/speed.c b/ccan/tdb2/tools/speed.c index 84dff996..7a100d0a 100644 --- a/ccan/tdb2/tools/speed.c +++ b/ccan/tdb2/tools/speed.c @@ -43,6 +43,43 @@ static int count_record(struct tdb_context *tdb, return 0; } +static void dump_and_clear_stats(struct tdb_attribute_stats *stats) +{ + printf("allocs = %llu\n", + (unsigned long long)stats->allocs); + printf(" alloc_subhash = %llu\n", + (unsigned long long)stats->alloc_subhash); + printf(" alloc_bucket_exact = %llu\n", + (unsigned long long)stats->alloc_bucket_exact); + printf(" alloc_bucket_max = %llu\n", + (unsigned long long)stats->alloc_bucket_max); + printf(" alloc_leftover = %llu\n", + (unsigned long long)stats->alloc_leftover); + printf(" alloc_coalesce_tried = %llu\n", + (unsigned long long)stats->alloc_coalesce_tried); + printf(" alloc_coalesce_lockfail = %llu\n", + (unsigned long long)stats->alloc_coalesce_lockfail); + printf(" alloc_coalesce_race = %llu\n", + (unsigned long long)stats->alloc_coalesce_race); + printf(" alloc_coalesce_succeeded = %llu\n", + (unsigned long long)stats->alloc_coalesce_succeeded); + printf(" alloc_coalesce_num_merged = %llu\n", + (unsigned long long)stats->alloc_coalesce_num_merged); + printf("expands = %llu\n", + (unsigned long long)stats->expands); + printf("frees = %llu\n", + (unsigned long long)stats->frees); + printf("locks = %llu\n", + (unsigned long long)stats->locks); + printf(" lock_lowlevel = %llu\n", + (unsigned long long)stats->lock_lowlevel); + printf(" lock_nonblock = %llu\n", + (unsigned long long)stats->lock_nonblock); + + /* Now clear. */ + memset(&stats->allocs, 0, (char *)(stats+1) - (char *)&stats->allocs); +} + int main(int argc, char *argv[]) { unsigned int i, j, num = 1000, stage = 0, stopat = -1; @@ -51,13 +88,18 @@ int main(int argc, char *argv[]) TDB_DATA key, data; struct tdb_context *tdb; struct timeval start, stop; - union tdb_attribute seed; + union tdb_attribute seed, stats; /* Try to keep benchmarks even. */ seed.base.attr = TDB_ATTRIBUTE_SEED; seed.base.next = NULL; seed.seed.seed = 0; + memset(&stats, 0, sizeof(stats)); + stats.base.attr = TDB_ATTRIBUTE_STATS; + stats.base.next = NULL; + stats.stats.size = sizeof(stats); + if (argv[1] && strcmp(argv[1], "--internal") == 0) { flags = TDB_INTERNAL; argc--; @@ -68,6 +110,11 @@ int main(int argc, char *argv[]) argc--; argv++; } + if (argv[1] && strcmp(argv[1], "--stats") == 0) { + seed.base.next = &stats; + argc--; + argv++; + } tdb = tdb_open("/tmp/speed.tdb", flags, O_RDWR|O_CREAT|O_TRUNC, 0600, &seed); @@ -105,6 +152,9 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(tdb)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + + if (seed.base.next) + dump_and_clear_stats(&stats.stats); if (++stage == stopat) exit(0); @@ -126,6 +176,8 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(tdb)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (seed.base.next) + dump_and_clear_stats(&stats.stats); if (++stage == stopat) exit(0); @@ -146,6 +198,8 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(tdb)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (seed.base.next) + dump_and_clear_stats(&stats.stats); if (++stage == stopat) exit(0); @@ -165,6 +219,8 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(tdb)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (seed.base.next) + dump_and_clear_stats(&stats.stats); if (++stage == stopat) exit(0); @@ -185,6 +241,8 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(tdb)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (seed.base.next) + dump_and_clear_stats(&stats.stats); if (++stage == stopat) exit(0); @@ -205,6 +263,8 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(tdb)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (seed.base.next) + dump_and_clear_stats(&stats.stats); if (++stage == stopat) exit(0); @@ -248,5 +308,10 @@ int main(int argc, char *argv[]) printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (seed.base.next) + dump_and_clear_stats(&stats.stats); + if (++stage == stopat) + exit(0); + return 0; }