benchmark-test.cc 6.13 KB
Newer Older
1 2
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
3
#ident "$Id$"
4
#ident "Copyright (c) 2007, 2008 Tokutek Inc.  All rights reserved."
5

Yoni Fogel's avatar
Yoni Fogel committed
6 7
#include "test.h"

Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
8
/* Insert a bunch of stuff */
9
#include "includes.h"
10
#include <toku_time.h>
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
11

12
static const char *fname ="sinsert.ft_handle";
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
13 14

enum { SERIAL_SPACING = 1<<6 };
15 16
int64_t ITEMS_TO_INSERT_PER_ITERATION = 1<<20;
int64_t BOUND_INCREASE_PER_ITERATION = SERIAL_SPACING*ITEMS_TO_INSERT_PER_ITERATION;
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
17 18

enum { NODE_SIZE = 1<<20 };
19
enum { BASEMENT_NODE_SIZE = 128 * 1024 };
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
20

21
static int nodesize = NODE_SIZE;
22
static int basementnodesize = BASEMENT_NODE_SIZE;
23
static enum toku_compression_method compression_method = TOKU_DEFAULT_COMPRESSION_METHOD;
24 25 26
static int keysize = sizeof (long long);
static int valsize = sizeof (long long);
static int do_verify =0; /* Do a slow verify after every insert. */
27

28 29
static int do_serial = 1;
static int do_random = 1;
Rich Prohaska's avatar
Rich Prohaska committed
30

31
static CACHETABLE ct;
32
static FT_HANDLE t;
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
33

34
static void setup (void) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
35
    int r;
36
    unlink(fname);
37
    toku_cachetable_create(&ct, 0, ZERO_LSN, NULL_LOGGER);
38
    r = toku_open_ft_handle(fname, 1, &t, nodesize, basementnodesize, compression_method, ct, NULL_TXN, toku_builtin_compare_fun); assert(r==0);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
39 40
}

41
static void toku_shutdown (void) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
42
    int r;
43
    r = toku_close_ft_handle_nolsn(t, 0); assert(r==0);
44
    toku_cachetable_close(&ct);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
45
}
46
static void long_long_to_array (unsigned char *a, unsigned long long l) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
47 48 49 50 51
    int i;
    for (i=0; i<8; i++)
	a[i] = (l>>(56-8*i))&0xff;
}

52
static void insert (long long v) {
Rich Prohaska's avatar
Rich Prohaska committed
53
    unsigned char kc[keysize], vc[valsize];
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
54
    DBT  kt, vt;
Rich Prohaska's avatar
Rich Prohaska committed
55
    memset(kc, 0, sizeof kc);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
56
    long_long_to_array(kc, v);
Rich Prohaska's avatar
Rich Prohaska committed
57
    memset(vc, 0, sizeof vc);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
58
    long_long_to_array(vc, v);
59
    toku_ft_insert(t, toku_fill_dbt(&kt, kc, keysize), toku_fill_dbt(&vt, vc, valsize), 0);
60
    if (do_verify) toku_cachetable_verify(ct);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
61 62
}

63
static void serial_insert_from (long long from) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
64 65
    long long i;
    for (i=0; i<ITEMS_TO_INSERT_PER_ITERATION; i++) {
66
	insert((from+i)*SERIAL_SPACING);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
67 68 69
    }
}

70
static long long llrandom (void) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
71 72 73
    return (((long long)(random()))<<32) + random();
}

74
static void random_insert_below (long long below) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
75
    long long i;
Bradley C. Kuszmaul's avatar
Up  
Bradley C. Kuszmaul committed
76
    assert(0 < below);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
77 78 79 80 81
    for (i=0; i<ITEMS_TO_INSERT_PER_ITERATION; i++) {
	insert(llrandom()%below);
    }
}

82
static void biginsert (long long n_elements, struct timeval *starttime) {
Bradley C. Kuszmaul's avatar
Up  
Bradley C. Kuszmaul committed
83
    long long i;
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
84
    struct timeval t1,t2;
85 86
    int iteration;
    for (i=0, iteration=0; i<n_elements; i+=ITEMS_TO_INSERT_PER_ITERATION, iteration++) {
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
87
	gettimeofday(&t1,0);
88 89
	if (do_serial)
            serial_insert_from(i);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
90
	gettimeofday(&t2,0);
91
	if (verbose && do_serial) {
92
	    printf("serial %9.6fs %8.0f/s    ", toku_tdiff(&t2, &t1), ITEMS_TO_INSERT_PER_ITERATION/toku_tdiff(&t2, &t1));
93 94
	    fflush(stdout);
	}
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
95
	gettimeofday(&t1,0);
96 97
        if (do_random)
            random_insert_below((i+ITEMS_TO_INSERT_PER_ITERATION)*SERIAL_SPACING);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
98
	gettimeofday(&t2,0);
99
	if (verbose && do_random) {
100
	    printf("random %9.6fs %8.0f/s    ", toku_tdiff(&t2, &t1), ITEMS_TO_INSERT_PER_ITERATION/toku_tdiff(&t2, &t1));
101
	    fflush(stdout);
102 103 104 105 106
        }
        if (verbose && (do_serial || do_random)) {
            double f = 0;
            if (do_serial) f += 1.0;
            if (do_random) f += 1.0;
107
	    printf("cumulative %9.6fs %8.0f/s\n", toku_tdiff(&t2, starttime), (ITEMS_TO_INSERT_PER_ITERATION*f/toku_tdiff(&t2, starttime))*(iteration+1));
108
	    fflush(stdout);
109
	}
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
110 111 112
    }
}

113
static void usage(void) {
114 115 116 117 118 119 120 121 122
    printf("benchmark-test [OPTIONS] [ITERATIONS]\n");
    printf("[-v]\n");
    printf("[-q]\n");
    printf("[--nodesize NODESIZE]\n");
    printf("[--keysize KEYSIZE]\n");
    printf("[--valsize VALSIZE]\n");
    printf("[--noserial]\n");
    printf("[--norandom]\n");
    printf("[--verify]\n");
123
}
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
124

Yoni Fogel's avatar
Yoni Fogel committed
125 126 127
int
test_main (int argc, const char *argv[]) {
    verbose=1; //Default
128 129 130
    /* parse parameters */
    int i;
    for (i=1; i<argc; i++) {
Yoni Fogel's avatar
Yoni Fogel committed
131
        const char *arg = argv[i];
132 133 134 135 136 137 138
        if (arg[0] != '-')
            break;
        if (strcmp(arg, "--nodesize") == 0) {
            if (i+1 < argc) {
                i++;
                nodesize = atoi(argv[i]);
            }
139
        } else if (strcmp(arg, "--keysize") == 0) {
Rich Prohaska's avatar
Rich Prohaska committed
140 141 142 143
            if (i+1 < argc) {
                i++;
                keysize = atoi(argv[i]);
            }
144 145 146 147 148
        } else if (strcmp(arg, "--periter") == 0) {
            if (i+1 < argc) {
                i++;
                ITEMS_TO_INSERT_PER_ITERATION = atoi(argv[i]);
            }
149
        } else if (strcmp(arg, "--valsize") == 0) {
Rich Prohaska's avatar
Rich Prohaska committed
150 151 152 153
            if (i+1 < argc) {
                i++;
                valsize = atoi(argv[i]);
            }
154
        } else if (strcmp(arg, "--verify")==0) {
155
	    do_verify = 1;
156 157
        } else if (strcmp(arg, "--noserial") == 0) {
            do_serial = 0;
158 159 160 161 162
        } else if (strcmp(arg, "--fname") == 0) {
            if (i+1 < argc) {
                i++;
                fname = argv[i];
            }
163 164
        } else if (strcmp(arg, "--norandom") == 0) {
            do_random = 0;
165
	} else if (strcmp(arg, "-v")==0) {
166
	    verbose++;
167 168 169 170 171
	} else if (strcmp(arg, "-q")==0) {
	    verbose = 0;
	} else {
	    usage();
	    return 1;
172
	}
173 174
    }

Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
175
    struct timeval t1,t2,t3;
176
    long long total_n_items;
177
    if (i < argc) {
178 179
	char *end;
	errno=0;
180
	total_n_items = ITEMS_TO_INSERT_PER_ITERATION * (long long) strtol(argv[i], &end, 10);
181 182
	assert(errno==0);
	assert(*end==0);
183
	assert(end!=argv[i]);
184 185 186
    } else {
	total_n_items = 1LL<<22; // 1LL<<16
    }
187

188 189 190 191
    if (verbose) {
	printf("nodesize=%d\n", nodesize);
	printf("keysize=%d\n", keysize);
	printf("valsize=%d\n", valsize);
192
	printf("Serial and random insertions of %" PRId64 " per batch\n", ITEMS_TO_INSERT_PER_ITERATION);
193
        fflush(stdout);
194
    }
Rich Prohaska's avatar
Rich Prohaska committed
195
    setup();
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
196
    gettimeofday(&t1,0);
197
    biginsert(total_n_items, &t1);
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
198
    gettimeofday(&t2,0);
199
    toku_shutdown();
Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
200
    gettimeofday(&t3,0);
201
    if (verbose) {
202 203 204
        int f = 0;
        if (do_serial) f += 1;
        if (do_random) f += 1;
205 206
	printf("Shutdown %9.6fs\n", toku_tdiff(&t3, &t2));
	printf("Total time %9.6fs for %lld insertions = %8.0f/s\n", toku_tdiff(&t3, &t1), f*total_n_items, f*total_n_items/toku_tdiff(&t3, &t1));
207
        fflush(stdout);
208
    }
209
    unlink(fname);
210

Bradley C. Kuszmaul's avatar
Bradley C. Kuszmaul committed
211 212 213
    return 0;
}