2007-11-29 14:18:54 +00:00
|
|
|
/* -*- mode: C; c-basic-offset: 4 -*- */
|
2008-01-24 15:10:32 +00:00
|
|
|
#ident "Copyright (c) 2007, 2008 Tokutek Inc. All rights reserved."
|
2007-11-29 14:18:54 +00:00
|
|
|
|
2007-08-01 20:53:18 +00:00
|
|
|
/* Insert a bunch of stuff */
|
|
|
|
#include "brt.h"
|
|
|
|
#include "key.h"
|
2007-08-07 23:14:09 +00:00
|
|
|
#include "memory.h"
|
2007-08-01 20:53:18 +00:00
|
|
|
#include <assert.h>
|
2007-08-13 20:20:42 +00:00
|
|
|
#include <errno.h>
|
2007-09-06 20:13:56 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <sys/time.h>
|
|
|
|
#include <unistd.h>
|
2007-08-01 20:53:18 +00:00
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static const char fname[]="sinsert.brt";
|
2007-08-01 20:53:18 +00:00
|
|
|
|
|
|
|
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 };
|
|
|
|
|
|
|
|
enum { NODE_SIZE = 1<<20 };
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static int nodesize = NODE_SIZE;
|
|
|
|
static int keysize = sizeof (long long);
|
|
|
|
static int valsize = sizeof (long long);
|
|
|
|
static int do_verify =0; /* Do a slow verify after every insert. */
|
2007-10-17 22:10:47 +00:00
|
|
|
|
2007-12-22 20:56:20 +00:00
|
|
|
static int verbose = 1;
|
2007-10-17 19:35:06 +00:00
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static CACHETABLE ct;
|
|
|
|
static BRT t;
|
2007-08-01 20:53:18 +00:00
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void setup (void) {
|
2007-08-01 20:53:18 +00:00
|
|
|
int r;
|
|
|
|
unlink(fname);
|
2007-11-29 14:44:03 +00:00
|
|
|
r = toku_brt_create_cachetable(&ct, 0, ZERO_LSN, NULL_LOGGER); assert(r==0);
|
2007-11-29 15:09:14 +00:00
|
|
|
r = toku_open_brt(fname, 0, 1, &t, nodesize, ct, NULL_TXN, toku_default_compare_fun, (DB*)0); assert(r==0);
|
2007-08-01 20:53:18 +00:00
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void shutdown (void) {
|
2007-08-01 20:53:18 +00:00
|
|
|
int r;
|
2007-11-29 15:09:14 +00:00
|
|
|
r = toku_close_brt(t); assert(r==0);
|
2007-11-19 23:47:44 +00:00
|
|
|
r = toku_cachetable_close(&ct); assert(r==0);
|
2007-08-01 20:53:18 +00:00
|
|
|
}
|
2007-11-29 18:14:40 +00:00
|
|
|
static void long_long_to_array (unsigned char *a, unsigned long long l) {
|
2007-08-01 20:53:18 +00:00
|
|
|
int i;
|
|
|
|
for (i=0; i<8; i++)
|
|
|
|
a[i] = (l>>(56-8*i))&0xff;
|
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void insert (long long v) {
|
2007-10-17 19:35:06 +00:00
|
|
|
unsigned char kc[keysize], vc[valsize];
|
2007-08-01 20:53:18 +00:00
|
|
|
DBT kt, vt;
|
2007-10-17 19:35:06 +00:00
|
|
|
memset(kc, 0, sizeof kc);
|
2007-08-01 20:53:18 +00:00
|
|
|
long_long_to_array(kc, v);
|
2007-10-17 19:35:06 +00:00
|
|
|
memset(vc, 0, sizeof vc);
|
2007-08-01 20:53:18 +00:00
|
|
|
long_long_to_array(vc, v);
|
2007-11-29 15:17:46 +00:00
|
|
|
toku_brt_insert(t, toku_fill_dbt(&kt, kc, keysize), toku_fill_dbt(&vt, vc, valsize), 0);
|
2007-11-19 23:47:44 +00:00
|
|
|
if (do_verify) toku_cachetable_verify(ct);
|
2007-08-01 20:53:18 +00:00
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void serial_insert_from (long long from) {
|
2007-08-01 20:53:18 +00:00
|
|
|
long long i;
|
|
|
|
for (i=0; i<ITEMS_TO_INSERT_PER_ITERATION; i++) {
|
2007-08-13 17:31:28 +00:00
|
|
|
insert((from+i)*SERIAL_SPACING);
|
2007-08-01 20:53:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static long long llrandom (void) {
|
2007-08-01 20:53:18 +00:00
|
|
|
return (((long long)(random()))<<32) + random();
|
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void random_insert_below (long long below) {
|
2007-08-01 20:53:18 +00:00
|
|
|
long long i;
|
2007-11-14 17:58:38 +00:00
|
|
|
assert(0 < below);
|
2007-08-01 20:53:18 +00:00
|
|
|
for (i=0; i<ITEMS_TO_INSERT_PER_ITERATION; i++) {
|
|
|
|
insert(llrandom()%below);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static double tdiff (struct timeval *a, struct timeval *b) {
|
2007-08-01 20:53:18 +00:00
|
|
|
return (a->tv_sec-b->tv_sec)+1e-6*(a->tv_usec-b->tv_usec);
|
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void biginsert (long long n_elements, struct timeval *starttime) {
|
2007-11-14 17:58:38 +00:00
|
|
|
long long i;
|
2007-08-01 20:53:18 +00:00
|
|
|
struct timeval t1,t2;
|
2007-08-13 20:20:42 +00:00
|
|
|
int iteration;
|
|
|
|
for (i=0, iteration=0; i<n_elements; i+=ITEMS_TO_INSERT_PER_ITERATION, iteration++) {
|
2007-08-01 20:53:18 +00:00
|
|
|
gettimeofday(&t1,0);
|
|
|
|
serial_insert_from(i);
|
|
|
|
gettimeofday(&t2,0);
|
2007-12-22 20:56:20 +00:00
|
|
|
if (verbose) {
|
|
|
|
printf("serial %9.6fs %8.0f/s ", tdiff(&t2, &t1), ITEMS_TO_INSERT_PER_ITERATION/tdiff(&t2, &t1));
|
|
|
|
fflush(stdout);
|
|
|
|
}
|
2007-08-01 20:53:18 +00:00
|
|
|
gettimeofday(&t1,0);
|
2007-08-13 17:31:28 +00:00
|
|
|
random_insert_below((i+ITEMS_TO_INSERT_PER_ITERATION)*SERIAL_SPACING);
|
2007-08-01 20:53:18 +00:00
|
|
|
gettimeofday(&t2,0);
|
2007-12-22 20:56:20 +00:00
|
|
|
if (verbose) {
|
|
|
|
printf("random %9.6fs %8.0f/s ", tdiff(&t2, &t1), ITEMS_TO_INSERT_PER_ITERATION/tdiff(&t2, &t1));
|
|
|
|
printf("cumulative %9.6fs %8.0f/s\n", tdiff(&t2, starttime), (ITEMS_TO_INSERT_PER_ITERATION*2.0/tdiff(&t2, starttime))*(iteration+1));
|
|
|
|
}
|
2007-08-01 20:53:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-29 18:14:40 +00:00
|
|
|
static void usage() {
|
2008-01-22 18:37:07 +00:00
|
|
|
printf("benchmark-test [-v] [--nodesize NODESIZE] [--keysize KEYSIZE] [--valsize VALSIZE] [--verify] [ITERATIONS]\n");
|
2007-10-15 21:12:08 +00:00
|
|
|
}
|
2007-08-01 20:53:18 +00:00
|
|
|
|
2007-08-13 20:20:42 +00:00
|
|
|
int main (int argc, char *argv[]) {
|
2007-10-15 21:12:08 +00:00
|
|
|
/* parse parameters */
|
|
|
|
int i;
|
|
|
|
for (i=1; i<argc; i++) {
|
|
|
|
char *arg = argv[i];
|
|
|
|
if (arg[0] != '-')
|
|
|
|
break;
|
|
|
|
if (strcmp(arg, "--nodesize") == 0) {
|
|
|
|
if (i+1 < argc) {
|
|
|
|
i++;
|
|
|
|
nodesize = atoi(argv[i]);
|
|
|
|
}
|
2007-12-22 20:56:20 +00:00
|
|
|
} else if (strcmp(arg, "--keysize") == 0) {
|
2007-10-17 19:35:06 +00:00
|
|
|
if (i+1 < argc) {
|
|
|
|
i++;
|
|
|
|
keysize = atoi(argv[i]);
|
|
|
|
}
|
2007-12-22 20:56:20 +00:00
|
|
|
} else if (strcmp(arg, "--valsize") == 0) {
|
2007-10-17 19:35:06 +00:00
|
|
|
if (i+1 < argc) {
|
|
|
|
i++;
|
|
|
|
valsize = atoi(argv[i]);
|
|
|
|
}
|
2007-12-22 20:56:20 +00:00
|
|
|
} else if (strcmp(arg, "--verify")==0) {
|
2007-10-17 22:10:47 +00:00
|
|
|
do_verify = 1;
|
2007-12-22 20:56:20 +00:00
|
|
|
} else if (strcmp(arg, "-v")==0) {
|
2008-01-22 18:37:07 +00:00
|
|
|
verbose++;
|
2007-12-22 20:56:20 +00:00
|
|
|
} else if (strcmp(arg, "-q")==0) {
|
|
|
|
verbose = 0;
|
|
|
|
} else {
|
|
|
|
usage();
|
|
|
|
return 1;
|
2007-10-17 22:10:47 +00:00
|
|
|
}
|
2007-10-15 21:12:08 +00:00
|
|
|
}
|
|
|
|
|
2007-08-01 20:53:18 +00:00
|
|
|
struct timeval t1,t2,t3;
|
2007-08-13 20:20:42 +00:00
|
|
|
long long total_n_items;
|
2007-10-15 21:12:08 +00:00
|
|
|
if (i < argc) {
|
2007-08-13 20:20:42 +00:00
|
|
|
char *end;
|
|
|
|
errno=0;
|
2007-10-15 21:12:08 +00:00
|
|
|
total_n_items = ITEMS_TO_INSERT_PER_ITERATION * (long long) strtol(argv[i], &end, 10);
|
2007-08-13 20:20:42 +00:00
|
|
|
assert(errno==0);
|
|
|
|
assert(*end==0);
|
2007-10-15 21:12:08 +00:00
|
|
|
assert(end!=argv[i]);
|
2007-08-13 20:20:42 +00:00
|
|
|
} else {
|
|
|
|
total_n_items = 1LL<<22; // 1LL<<16
|
|
|
|
}
|
2007-10-15 21:12:08 +00:00
|
|
|
|
2007-12-22 20:56:20 +00:00
|
|
|
if (verbose) {
|
|
|
|
printf("nodesize=%d\n", nodesize);
|
|
|
|
printf("keysize=%d\n", keysize);
|
|
|
|
printf("valsize=%d\n", valsize);
|
|
|
|
printf("Serial and random insertions of %d per batch\n", ITEMS_TO_INSERT_PER_ITERATION);
|
|
|
|
}
|
2007-10-17 19:35:06 +00:00
|
|
|
setup();
|
2007-08-01 20:53:18 +00:00
|
|
|
gettimeofday(&t1,0);
|
2007-08-13 20:20:42 +00:00
|
|
|
biginsert(total_n_items, &t1);
|
2007-08-01 20:53:18 +00:00
|
|
|
gettimeofday(&t2,0);
|
|
|
|
shutdown();
|
|
|
|
gettimeofday(&t3,0);
|
2007-12-22 20:56:20 +00:00
|
|
|
if (verbose) {
|
|
|
|
printf("Shutdown %9.6fs\n", tdiff(&t3, &t2));
|
|
|
|
printf("Total time %9.6fs for %lld insertions = %8.0f/s\n", tdiff(&t3, &t1), 2*total_n_items, 2*total_n_items/tdiff(&t3, &t1));
|
|
|
|
}
|
2008-01-22 18:37:07 +00:00
|
|
|
if (verbose>1) {
|
2007-12-22 20:56:20 +00:00
|
|
|
toku_malloc_report();
|
|
|
|
}
|
2007-11-29 15:34:49 +00:00
|
|
|
toku_malloc_cleanup();
|
2007-08-01 20:53:18 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|