diff options
Diffstat (limited to 'libibex')
-rw-r--r-- | libibex/testindex.c | 151 |
1 files changed, 134 insertions, 17 deletions
diff --git a/libibex/testindex.c b/libibex/testindex.c index d06ff842d5..e531e3291a 100644 --- a/libibex/testindex.c +++ b/libibex/testindex.c @@ -10,6 +10,18 @@ #include <pthread.h> #endif +#define TIMEIT +/*#define DO_MCHECK*/ + +#ifdef TIMEIT +#include <sys/time.h> +#include <unistd.h> +#endif + +#ifdef DO_MCHECK +#include <mcheck.h> +#endif + void word_index_mem_dump_info(struct _IBEXWord *idx); /* @@ -97,27 +109,64 @@ read_words(void *in) } #endif + + +#ifdef DO_MCHECK +static int blowup(int status) +{ + switch(status) { + case 1: + printf("Double free failure\n"); + break; + case 2: + printf("Memory clobbered before block\n"); + break; + case 3: + printf("Memory clobbered after block\n"); + break; + } + abort(); + return status; +} +#endif + int main(int argc, char **argv) { int i, j; - GPtrArray *words = g_ptr_array_new(); + GPtrArray *words; char line[256]; int len; FILE *file; float m, s; ibex *ib; - GString *buffer = g_string_new(""); + GString *buffer; int files; char *dict; - + int synccount; +#ifdef TIMEIT + struct timeval start, end; + unsigned long diff; +#endif #ifdef ENABLE_THREADS pthread_t id; +#endif + mcheck(blowup); + + words = g_ptr_array_new(); + buffer = g_string_new(""); +#ifdef ENABLE_THREADS g_thread_init(0); +#undef ENABLE_THREADS +#endif + +#ifdef TIMEIT + gettimeofday(&start, NULL); #endif srand(0xABADF00D); + synccount = 1000; files = 8000; dict = "/usr/dict/words"; @@ -158,35 +207,96 @@ int main(int argc, char **argv) #endif printf("Adding %d files\n", files); + /* simulate adding new words to a bunch of files */ - for (j=0;j<files;j++) { + for (j=0;j<200000;j++) { /* always new name */ - char *name = words->pdata[j % words->len]; + char *name; /* something like 60 words in a typical message, say */ int count = (int)box_muller(60.0, 20.0); + int word = (int)box_muller(m, 4000); + GPtrArray *a; + static int lastlen = 0; + + /* random name */ + name = words->pdata[word % words->len]; - if (j%1000 == 0) + if (j%1000 == 0) { + IBEX_LOCK(ib); word_index_mem_dump_info(ib->words); + IBEX_UNLOCK(ib); + } + + /* lookup word just to test lookup */ + a = ibex_find(ib, name); + if (a) { + for (i=0;i<a->len;i++) + g_free(a->pdata[i]); + g_ptr_array_free(a, TRUE); + } + + /* half the time, remove items from the index */ + if (rand() < RAND_MAX/2) { + ibex_unindex(ib, name); + } else { + /* cache the name info */ + ibex_contains_name(ib, name); + + /*printf("Adding %d words to '%s'\n", count, name);*/ - /* cache the name info */ - ibex_contains_name(ib, name); + g_string_truncate(buffer, 0); - /*printf("Adding %d words to '%s'\n", count, name);*/ + /* build up the word buffer */ + for (i=0;i<count;i++) { + if (i>0) + g_string_append_c(buffer, ' '); + g_string_append(buffer, getword(words, m, 2000)); + } + + /* and index it */ + ibex_index_buffer(ib, name, buffer->str, buffer->len, NULL); + } + + + a = ibex_find(ib, "joneses"); + if (a) { + if (a->len != lastlen) { + printf("Found %d joneses!\n", a->len); + lastlen = a->len; + } + for (i=0;i<a->len;i++) + g_free(a->pdata[i]); + g_ptr_array_free(a, TRUE); + } - g_string_truncate(buffer, 0); + if (j%synccount == 0) { + printf("Reloading index\n"); + IBEX_LOCK(ib); + word_index_mem_dump_info(ib->words); + IBEX_UNLOCK(ib); +#ifdef ENABLE_THREADS + do_read_words = 0; + pthread_join(id, 0); +#endif + ibex_save(ib); + ibex_close(ib); - /* build up the word buffer */ - for (i=0;i<count;i++) { - if (i>0) - g_string_append_c(buffer, ' '); - g_string_append(buffer, getword(words, m, s)); + ib = ibex_open("test.ibex", O_RDWR|O_CREAT, 0600); + IBEX_LOCK(ib); + word_index_mem_dump_info(ib->words); + IBEX_UNLOCK(ib); +#ifdef ENABLE_THREADS + do_read_words = 1; + pthread_create(&id, 0, read_words, ib); +#endif } - /* and index it */ - ibex_index_buffer(ib, name, buffer->str, buffer->len, NULL); } + + IBEX_LOCK(ib); word_index_mem_dump_info(ib->words); + IBEX_UNLOCK(ib); #ifdef ENABLE_THREADS do_read_words = 0; @@ -195,6 +305,13 @@ int main(int argc, char **argv) ibex_close(ib); +#ifdef TIMEIT + gettimeofday(&end, NULL); + diff = end.tv_sec * 1000 + end.tv_usec/1000; + diff -= start.tv_sec * 1000 + start.tv_usec/1000; + printf("Total time taken %ld.%03ld seconds\n", diff / 1000, diff % 1000); +#endif + return 0; } |