/* Insert a bunch of stuff */ #include #include #include #include #include #include #include #include #include enum { SERIAL_SPACING = 1<<6 }; enum { ITEMS_TO_INSERT_PER_ITERATION = 1<<20 }; //enum { ITEMS_TO_INSERT_PER_ITERATION = 1<<14 }; enum { BOUND_INCREASE_PER_ITERATION = SERIAL_SPACING*ITEMS_TO_INSERT_PER_ITERATION }; char *dbdir = "."; char *dbfilename = "bench.db"; char *dbname; DB_ENV *dbenv; DB *db; void setup (void) { int r; char fullname[strlen(dbdir) + strlen("/") + strlen(dbfilename) + 1]; sprintf(fullname, "%s/%s", dbdir, dbfilename); unlink(fullname); if (strcmp(dbdir, ".") != 0) mkdir(dbdir, 0755); r = db_env_create(&dbenv, 0); assert(r == 0); if (dbenv->set_cachesize) { r = dbenv->set_cachesize(dbenv, 0, 128*1024*1024, 1); if (r != 0) printf("WARNING: set_cachesize %d\n", r); } r = dbenv->open(dbenv, dbdir, DB_CREATE|DB_PRIVATE|DB_INIT_MPOOL, 0644); assert(r == 0); r = db_create(&db, dbenv, 0); assert(r == 0); r = db->open(db, NULL, dbfilename, NULL, DB_BTREE, DB_CREATE, 0644); assert(r == 0); } void shutdown (void) { int r; r = db->close(db, 0); assert(r == 0); r = dbenv->close(dbenv, 0); assert(r == 0); } void long_long_to_array (unsigned char *a, unsigned long long l) { int i; for (i=0; i<8; i++) a[i] = (l>>(56-8*i))&0xff; } DBT *fill_dbt(DBT *dbt, void *data, int size) { memset(dbt, 0, sizeof *dbt); dbt->size = size; dbt->data = data; return dbt; } void insert (long long v) { unsigned char kc[8], vc[8]; DBT kt, vt; long_long_to_array(kc, v); long_long_to_array(vc, v); int r = db->put(db, NULL, fill_dbt(&kt, kc, 8), fill_dbt(&vt, vc, 8), 0); assert(r == 0); } void serial_insert_from (long long from) { long long i; for (i=0; itv_sec-b->tv_sec)+1e-6*(a->tv_usec-b->tv_usec); } void biginsert (long long n_elements, struct timeval *starttime) { long i; struct timeval t1,t2; int iteration; for (i=0, iteration=0; i