From: Rusty Russell Date: Tue, 10 Jun 2014 05:04:46 +0000 (+0930) Subject: htable: tools: use tal instead of talloc. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=a2cb9a4f7f46effe1fdca5c05c3e0dfb6b3cc02a htable: tools: use tal instead of talloc. Signed-off-by: Rusty Russell --- diff --git a/ccan/htable/tools/Makefile b/ccan/htable/tools/Makefile index a21c51cb..a2cad59f 100644 --- a/ccan/htable/tools/Makefile +++ b/ccan/htable/tools/Makefile @@ -1,20 +1,40 @@ -CFLAGS=-Wall -Werror -O3 -I../../.. -#CFLAGS=-Wall -Werror -g -I../../.. +CCANDIR=../../.. +CFLAGS=-Wall -Werror -O3 -I$(CCANDIR) +#CFLAGS=-Wall -Werror -g -I$(CCANDIR) + +CCAN_OBJS:=ccan-tal.o ccan-tal-str.o ccan-tal-grab_file.o ccan-take.o ccan-time.o ccan-str.o ccan-noerr.o ccan-list.o all: speed stringspeed hsearchspeed -speed: speed.o hash.o +speed: speed.o hash.o $(CCAN_OBJS) speed.o: speed.c ../htable.h ../htable.c hash.o: ../../hash/hash.c $(CC) $(CFLAGS) -c -o $@ $< -stringspeed: stringspeed.o hash.o ../../talloc.o ../../str_talloc.o ../../grab_file.o ../../str.o ../../time.o ../../noerr.o +stringspeed: stringspeed.o hash.o $(CCAN_OBJS) stringspeed.o: speed.c ../htable.h ../htable.c -hsearchspeed: hsearchspeed.o ../../talloc.o ../../str_talloc.o ../../grab_file.o ../../str.o ../../time.o ../../noerr.o +hsearchspeed: hsearchspeed.o $(CCAN_OBJS) clean: rm -f stringspeed speed hsearchspeed *.o + +ccan-tal.o: $(CCANDIR)/ccan/tal/tal.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-tal-str.o: $(CCANDIR)/ccan/tal/str/str.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-take.o: $(CCANDIR)/ccan/take/take.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-tal-grab_file.o: $(CCANDIR)/ccan/tal/grab_file/grab_file.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-time.o: $(CCANDIR)/ccan/time/time.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-list.o: $(CCANDIR)/ccan/list/list.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-str.o: $(CCANDIR)/ccan/str/str.c + $(CC) $(CFLAGS) -c -o $@ $< +ccan-noerr.o: $(CCANDIR)/ccan/noerr/noerr.c + $(CC) $(CFLAGS) -c -o $@ $< diff --git a/ccan/htable/tools/hsearchspeed.c b/ccan/htable/tools/hsearchspeed.c index ea1a3f5c..6a8c62fc 100644 --- a/ccan/htable/tools/hsearchspeed.c +++ b/ccan/htable/tools/hsearchspeed.c @@ -1,9 +1,9 @@ /* Simple speed tests for a hash of strings using hsearch */ #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -15,51 +15,43 @@ #include /* Nanoseconds per operation */ -static size_t normalize(const struct timeval *start, - const struct timeval *stop, +static size_t normalize(const struct timespec *start, + const struct timespec *stop, unsigned int num) { - struct timeval diff; - - timersub(stop, start, &diff); - - /* Floating point is more accurate here. */ - return (double)(diff.tv_sec * 1000000 + diff.tv_usec) - / num * 1000; + return time_to_nsec(time_divide(time_sub(*stop, *start), num)); } int main(int argc, char *argv[]) { size_t i, j, num; - struct timeval start, stop; + struct timespec start, stop; char **w; ENTRY *words, *misswords; - w = strsplit(NULL, grab_file(NULL, - argv[1] ? argv[1] : "/usr/share/dict/words", - NULL), "\n"); - num = talloc_array_length(w) - 1; + w = tal_strsplit(NULL, grab_file(NULL, + argv[1] ? argv[1] : "/usr/share/dict/words"), "\n", STR_NO_EMPTY); + num = tal_count(w) - 1; printf("%zu words\n", num); hcreate(num+num/3); - words = talloc_array(w, ENTRY, num); + words = tal_arr(w, ENTRY, num); for (i = 0; i < num; i++) { words[i].key = w[i]; words[i].data = words[i].key; } /* Append and prepend last char for miss testing. */ - misswords = talloc_array(w, ENTRY, num); + misswords = tal_arr(w, ENTRY, num); for (i = 0; i < num; i++) { char lastc; if (strlen(w[i])) lastc = w[i][strlen(w[i])-1]; else lastc = 'z'; - misswords[i].key = talloc_asprintf(misswords, "%c%s%c%c", - lastc, w[i], - lastc, lastc); + misswords[i].key = tal_fmt(misswords, "%c%s%c%c", + lastc, w[i], lastc, lastc); } printf("#01: Initial insert: "); diff --git a/ccan/htable/tools/speed.c b/ccan/htable/tools/speed.c index 0b4e4344..a6e856d8 100644 --- a/ccan/htable/tools/speed.c +++ b/ccan/htable/tools/speed.c @@ -2,12 +2,11 @@ #include #include #include +#include #include #include #include -#include #include -#include static size_t hashcount; struct object { @@ -95,17 +94,11 @@ static size_t count_deleted(const struct htable *ht) } /* Nanoseconds per operation */ -static size_t normalize(const struct timeval *start, - const struct timeval *stop, +static size_t normalize(const struct timespec *start, + const struct timespec *stop, unsigned int num) { - struct timeval diff; - - timersub(stop, start, &diff); - - /* Floating point is more accurate here. */ - return (double)(diff.tv_sec * 1000000 + diff.tv_usec) - / num * 1000; + return time_to_nsec(time_divide(time_sub(*stop, *start), num)); } static size_t worst_run(struct htable *ht, size_t *deleted) @@ -135,7 +128,7 @@ int main(int argc, char *argv[]) { struct object *objs; size_t i, j, num, deleted; - struct timeval start, stop; + struct timespec start, stop; struct htable_obj ht; bool make_dumb = false; @@ -155,10 +148,10 @@ int main(int argc, char *argv[]) printf("Initial insert: "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) htable_obj_add(&ht, objs[i].self); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Details: hash size %u, mask bits %u, perfect %.0f%%\n", 1U << ht.raw.bits, popcount(ht.raw.common_mask), @@ -173,61 +166,61 @@ int main(int argc, char *argv[]) printf("Initial lookup (match): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) if (htable_obj_get(&ht, &i)->self != objs[i].self) abort(); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Initial lookup (miss): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) { unsigned int n = i + num; if (htable_obj_get(&ht, &n)) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); /* Lookups in order are very cache-friendly for judy; try random */ printf("Initial lookup (random): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0, j = 0; i < num; i++, j = (j + 10007) % num) if (htable_obj_get(&ht, &j)->self != &objs[j]) abort(); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); hashcount = 0; printf("Initial delete all: "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) if (!htable_obj_del(&ht, objs[i].self)) abort(); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Details: rehashes %zu\n", hashcount); printf("Initial re-inserting: "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) htable_obj_add(&ht, objs[i].self); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); hashcount = 0; printf("Deleting first half: "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i+=2) if (!htable_obj_del(&ht, objs[i].self)) abort(); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Details: rehashes %zu, delete markers %zu\n", @@ -239,10 +232,10 @@ int main(int argc, char *argv[]) for (i = 0; i < num; i+=2) objs[i].key = num+i; - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i+=2) htable_obj_add(&ht, objs[i].self); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Details: delete markers %zu, perfect %.0f%%\n", @@ -250,7 +243,7 @@ int main(int argc, char *argv[]) printf("Lookup after half-change (match): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 1; i < num; i+=2) if (htable_obj_get(&ht, &i)->self != objs[i].self) abort(); @@ -259,18 +252,18 @@ int main(int argc, char *argv[]) if (htable_obj_get(&ht, &n)->self != objs[i].self) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Lookup after half-change (miss): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) { unsigned int n = i + num * 2; if (htable_obj_get(&ht, &n)) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); /* Hashtables with delete markers can fill with markers over time. @@ -287,7 +280,7 @@ int main(int argc, char *argv[]) : "fifth"); fflush(stdout); } - gettimeofday(&start, NULL); + start = time_now(); for (j = 0; j < num; j++) { if (!htable_obj_del(&ht, &objs[j])) abort(); @@ -295,7 +288,7 @@ int main(int argc, char *argv[]) if (!htable_obj_add(&ht, &objs[j])) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); if (i != 0) printf(" %zu ns\n", normalize(&start, &stop, num)); } @@ -316,45 +309,45 @@ int main(int argc, char *argv[]) printf("Lookup after churn & spread (match): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) { unsigned int n = num * 5 + i * 9; if (htable_obj_get(&ht, &n)->self != objs[i].self) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Lookup after churn & spread (miss): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i++) { unsigned int n = num * (5 + 9) + i * 9; if (htable_obj_get(&ht, &n)) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Lookup after churn & spread (random): "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0, j = 0; i < num; i++, j = (j + 10007) % num) { unsigned int n = num * 5 + j * 9; if (htable_obj_get(&ht, &n)->self != &objs[j]) abort(); } - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); hashcount = 0; printf("Deleting half after churn & spread: "); fflush(stdout); - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i+=2) if (!htable_obj_del(&ht, objs[i].self)) abort(); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Adding (a different) half after churn & spread: "); @@ -363,10 +356,10 @@ int main(int argc, char *argv[]) for (i = 0; i < num; i+=2) objs[i].key = num*6+i*9; - gettimeofday(&start, NULL); + start = time_now(); for (i = 0; i < num; i+=2) htable_obj_add(&ht, objs[i].self); - gettimeofday(&stop, NULL); + stop = time_now(); printf(" %zu ns\n", normalize(&start, &stop, num)); printf("Details: delete markers %zu, perfect %.0f%%\n", diff --git a/ccan/htable/tools/stringspeed.c b/ccan/htable/tools/stringspeed.c index 53ac4da6..bd67f281 100644 --- a/ccan/htable/tools/stringspeed.c +++ b/ccan/htable/tools/stringspeed.c @@ -1,9 +1,9 @@ /* Simple speed tests for a hash of strings. */ #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -34,44 +34,38 @@ static bool cmp(const char *obj, const char *key) HTABLE_DEFINE_TYPE(char, strkey, hash_str, cmp, htable_str); /* Nanoseconds per operation */ -static size_t normalize(const struct timeval *start, - const struct timeval *stop, +static size_t normalize(const struct timespec *start, + const struct timespec *stop, unsigned int num) { - struct timeval diff; - - timersub(stop, start, &diff); - - /* Floating point is more accurate here. */ - return (double)(diff.tv_sec * 1000000 + diff.tv_usec) - / num * 1000; + return time_to_nsec(time_divide(time_sub(*stop, *start), num)); } int main(int argc, char *argv[]) { size_t i, j, num; - struct timeval start, stop; + struct timespec start, stop; struct htable_str ht; char **words, **misswords; - words = strsplit(NULL, grab_file(NULL, - argv[1] ? argv[1] : "/usr/share/dict/words", - NULL), "\n"); + words = tal_strsplit(NULL, grab_file(NULL, + argv[1] ? argv[1] : "/usr/share/dict/words"), "\n", + STR_NO_EMPTY); htable_str_init(&ht); - num = talloc_array_length(words) - 1; + num = tal_count(words) - 1; /* Note that on my system, num is just > 98304, where we double! */ printf("%zu words\n", num); /* Append and prepend last char for miss testing. */ - misswords = talloc_array(words, char *, num); + misswords = tal_arr(words, char *, num); for (i = 0; i < num; i++) { char lastc; if (strlen(words[i])) lastc = words[i][strlen(words[i])-1]; else lastc = 'z'; - misswords[i] = talloc_asprintf(misswords, "%c%s%c%c", - lastc, words[i], lastc, lastc); + misswords[i] = tal_fmt(misswords, "%c%s%c%c", + lastc, words[i], lastc, lastc); } printf("#01: Initial insert: ");