static void createdb(const char * filename, uint16_t order) { itzam_btree btree; itzam_state state; /* create an empty database file */ state = itzam_btree_create(&btree, filename, order, sizeof(int32_t), itzam_comparator_int32, error_handler); if (state != ITZAM_OKAY) { printf("Unable to create B-tree index file %s\n", filename); exit(1); } itzam_btree_close(&btree); }
bool test_btree_insert() { itzam_btree btree; itzam_state state; record rec; int n; char * filename = "insert.itz"; itzam_int test_size = 10000000; int order = 25; time_t start = time(NULL); memset(&rec.m_data,0,REC_SIZE * sizeof(uint32_t)); rec.m_key = 0; // banner for this test printf("\nItzam/C B-Tree Test\nStraight Insertion Performance\n"); printf("Please wait while I insert %d records of %d bytes...\n", (int)test_size, (int)(REC_SIZE * sizeof(uint32_t))); state = itzam_btree_create(&btree, filename, order, sizeof(record), compare_recs, error_handler); if (state != ITZAM_OKAY) { not_okay(state); return false; } for (n = 1; n <= test_size; ++ n) { rec.m_key = n; rec.m_data[0] = n; rec.m_data[REC_SIZE - 1] = n; state = itzam_btree_insert(&btree,(const void *)&rec); if (state != ITZAM_OKAY) { not_okay(state); return false; } } time_t elapsed = time(NULL) - start; printf(" database count: %d\n", (int)btree.m_header->m_count); printf(" database ticker: %d\n", (int)btree.m_header->m_ticker); printf(" total run time: %d seconds\n", (int)elapsed); printf("insertions per second: %f\n", ((double)test_size / (double)elapsed)); // verify database after benchmark itzam_btree_cursor cursor; state = itzam_btree_cursor_create(&cursor, &btree); if (state == ITZAM_OKAY) { do { // get the key pointed to by the cursor state = itzam_btree_cursor_read(&cursor,(void *)&rec); if (state == ITZAM_OKAY) { if ((rec.m_key != rec.m_data[0]) || (rec.m_key != rec.m_data[REC_SIZE - 1])) { printf("ERROR: record retrieved for %u does not match %u or %u\n",rec.m_key,rec.m_data[0],rec.m_data[REC_SIZE - 1]); break; } } else not_okay(state); } while (itzam_btree_cursor_next(&cursor)); state = itzam_btree_cursor_free(&cursor); if (state != ITZAM_OKAY) return false; } state = itzam_btree_close(&btree); if (state != ITZAM_OKAY) { not_okay(state); return false; } return true; }
static itzam_bool test_threaded() { const uint16_t order = 7; char * sfilename = "threaded.single"; char * mfilename = "threaded.multi"; time_t start; int maxkey = 5000; int test_size = 1000000; pthread_attr_t attr; pthread_t * thread; struct threadArgs * args; int completed = 0; int32_t key; int n; itzam_btree btree; itzam_state state; /* get number of processors available */ int num_threads = (int)sysconf(_SC_NPROCESSORS_CONF) - 1; if (num_threads < 2) num_threads = 2; thread = (pthread_t *)malloc(num_threads * sizeof(pthread_t)); args = (struct threadArgs *)malloc(num_threads * sizeof(struct threadArgs)); printf("\nItzam/C B-Tree Test\nMultiple threads, simultaneously using the same Itzam index\n\n"); printf("Parameters:\n%8d B-tree order\n%8d unique keys\n%8d threads\n%8d insert & remove operations\n", order, maxkey, num_threads, test_size); /* create threads and test simultaneous access to the database */ createdb(mfilename, order); test_size /= num_threads; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_attr_setschedpolicy(&attr, SCHED_RR); state = itzam_btree_open(&btree, mfilename, itzam_comparator_int32, error_handler, false, false); if (state != ITZAM_OKAY) { printf("Unable to open B-tree index file %s\n",mfilename); return itzam_false; } printf("\nPerforming multi-thread test... "); fflush(stdout); start = time(NULL); for (n = 0; n < num_threads; ++n) { args[n].btree = &btree; args[n].maxkey = maxkey; args[n].test_size = test_size; args[n].completed = &completed; pthread_create(&thread[n], &attr, threadProc, &args[n]); } while (completed < num_threads) usleep(100000); itzam_btree_close(&btree); free(thread); free(args); /* stats */ time_t melapsed = time(NULL) - start; printf("done\n\n%8d seconds run time\n\n", (int)melapsed); return itzam_true; }