1 import sys, os, time
3 from roundup.hyperdb import String, Password, Link, Multilink, Date, \
4 Interval, DatabaseError, Boolean, Number
5 from roundup import date, password
7 from db_test_base import config
9 def setupSchema(db, module):
10 status = module.Class(db, "status", name=String())
11 status.setkey("name")
12 user = module.Class(db, "user", username=String(), password=Password(),
13 assignable=Boolean(), age=Number(), roles=String())
14 user.setkey("username")
15 file = module.FileClass(db, "file", name=String(), type=String(),
16 comment=String(indexme="yes"))
17 issue = module.IssueClass(db, "issue", title=String(indexme="yes"),
18 status=Link("status"), nosy=Multilink("user"), deadline=Date(),
19 foo=Interval(), files=Multilink("file"), assignedto=Link('user'))
20 session = module.Class(db, 'session', title=String())
21 session.disableJournalling()
22 db.post_init()
23 db.commit()
25 def main(backendname, time=time.time, numissues=10):
26 try:
27 exec('from roundup.backends import %s as backend'%backendname)
28 except ImportError:
29 return
31 times = []
33 config.DATABASE = os.path.join('_benchmark', '%s-%s'%(backendname,
34 numissues))
35 if not os.path.exists(config.DATABASE):
36 db = backend.Database(config, 'admin')
37 setupSchema(db, backend)
38 # create a whole bunch of stuff
39 db.user.create(**{'username': 'admin'})
40 db.status.create(name="unread")
41 db.status.create(name="in-progress")
42 db.status.create(name="testing")
43 db.status.create(name="resolved")
44 pc = -1
45 for i in range(numissues):
46 db.user.create(**{'username': 'user %s'%i})
47 for j in range(10):
48 db.user.set(str(i+1), assignable=1)
49 db.user.set(str(i+1), assignable=0)
50 db.issue.create(**{'title': 'issue %s'%i})
51 for j in range(10):
52 db.issue.set(str(i+1), status='2', assignedto='2', nosy=[])
53 db.issue.set(str(i+1), status='1', assignedto='1',
54 nosy=['1','2'])
55 if (i*100/numissues) != pc:
56 pc = (i*100/numissues)
57 sys.stdout.write("%d%%\r"%pc)
58 sys.stdout.flush()
59 db.commit()
60 else:
61 db = backend.Database(config, 'admin')
62 setupSchema(db, backend)
64 sys.stdout.write('%7s: %-6d'%(backendname, numissues))
65 sys.stdout.flush()
67 times.append(('start', time()))
69 # fetch
70 db.clearCache()
71 for i in db.issue.list():
72 db.issue.get(i, 'title')
73 times.append(('fetch', time()))
75 # journals
76 db.clearCache()
77 for i in db.issue.list():
78 db.issue.history(i)
79 times.append(('journal', time()))
81 # "calculated" props
82 db.clearCache()
83 for i in db.issue.list():
84 db.issue.get(i, 'activity')
85 db.issue.get(i, 'creator')
86 db.issue.get(i, 'creation')
87 times.append(('jprops', time()))
89 # lookup
90 db.clearCache()
91 for i in range(numissues):
92 db.user.lookup('user %s'%i)
93 times.append(('lookup', time()))
95 # filter
96 db.clearCache()
97 for i in range(100):
98 db.issue.filter(None, {'assignedto': '1', 'title':'issue'},
99 ('+', 'activity'), ('+', 'status'))
100 times.append(('filter', time()))
102 # filter with multilink
103 db.clearCache()
104 for i in range(100):
105 db.issue.filter(None, {'nosy': ['1'], 'assignedto': '1',
106 'title':'issue'}, ('+', 'activity'), ('+', 'status'))
107 times.append(('filtml', time()))
109 # results
110 last = None
111 for event, stamp in times:
112 if last is None:
113 first = stamp
114 else:
115 sys.stdout.write(' %-6.2f'%(stamp-last))
116 last = stamp
117 print ' %-6.2f'%(last-first)
118 sys.stdout.flush()
120 if __name__ == '__main__':
121 # 0 1 2 3 4 5 6
122 # 01234567890123456789012345678901234567890123456789012345678901234
123 print 'Test name fetch journl jprops lookup filter filtml TOTAL '
124 for name in 'anydbm metakit sqlite'.split():
125 main(name)
126 for name in 'anydbm metakit sqlite'.split():
127 main(name, numissues=20)
128 for name in 'anydbm metakit sqlite'.split():
129 main(name, numissues=100)
130 # don't even bother benchmarking the dbm backends > 100!
131 for name in 'metakit sqlite'.split():
132 main(name, numissues=1000)
134 # vim: set et sts=4 sw=4 :