1
2# Roughly approximates some of Symas microbenchmark.
3
4from time import time
5import random
6import shutil
7import os
8import tempfile
9
10import lmdb
11
12
13val = ' ' * 100
14MAX_KEYS = int(1e6)
15
16t0 = time()
17
18urandom = file('/dev/urandom', 'rb', 1048576).read
19
20keys = set()
21while len(keys) < MAX_KEYS:
22    for _ in xrange(min(1000, MAX_KEYS - len(keys))):
23        keys.add(urandom(16))
24
25print 'make %d keys in %.2fsec' % (len(keys), time() - t0)
26keys = list(keys)
27
28if os.path.exists('/ram'):
29    DB_PATH = '/ram/dbtest'
30else:
31    DB_PATH = tempfile.mktemp(prefix='nastybench')
32
33if os.path.exists(DB_PATH):
34    shutil.rmtree(DB_PATH)
35
36env = lmdb.open(DB_PATH, map_size=1048576 * 1024,
37    metasync=False, sync=False, map_async=True)
38
39nextkey = iter(keys).next
40run = True
41while run:
42    with env.begin(write=True) as txn:
43        try:
44            for _ in xrange(10000):
45                txn.put(nextkey(), val)
46        except StopIteration:
47            run = False
48
49d = time() - t0
50env.sync(True)
51print 'insert %d keys in %.2fsec (%d/sec)' % (len(keys), d, len(keys) / d)
52
53
54
55nextkey = iter(keys).next
56t0 = time()
57
58with env.begin() as txn:
59    try:
60        while 1:
61            txn.get(nextkey())
62    except StopIteration:
63        pass
64
65d = time() - t0
66print 'random lookup %d keys in %.2fsec (%d/sec)' % (len(keys), d, len(keys)/d)
67
68
69nextkey = iter(keys).next
70t0 = time()
71
72with env.begin(buffers=True) as txn:
73    try:
74        while 1:
75            txn.get(nextkey())
76    except StopIteration:
77        pass
78
79d = time() - t0
80print 'random lookup %d buffers in %.2fsec (%d/sec)' % (len(keys), d, len(keys)/d)
81
82
83nextkey = iter(keys).next
84t0 = time()
85
86with env.begin(buffers=True) as txn:
87    try:
88        while 1:
89            hash(txn.get(nextkey()))
90    except StopIteration:
91        pass
92
93d = time() - t0
94print 'random lookup+hash %d buffers in %.2fsec (%d/sec)' % (len(keys), d, len(keys)/d)
95
96
97
98nextkey = iter(keys).next
99t0 = time()
100
101with env.begin(buffers=True) as txn:
102    nextrec = txn.cursor().iternext().next
103    try:
104        while 1:
105            nextrec()
106    except StopIteration:
107        pass
108
109d = time() - t0
110print 'seq read %d buffers in %.2fsec (%d/sec)' % (len(keys), d, len(keys)/d)
111