diff --git a/test/benchmark.py b/test/benchmark.py
index 496ce65542430b2d0da18e0b70bd63575f0e67fa..b42a7a2ae4c0a2d068407624fb493ebcee8e0137 100644 (file)
--- a/test/benchmark.py
+++ b/test/benchmark.py
-import sys, os, time, shutil
+import sys, os, time
from roundup.hyperdb import String, Password, Link, Multilink, Date, \
Interval, DatabaseError, Boolean, Number
from roundup import date, password
-from roundup.indexer import Indexer
+
+from db_test_base import config
def setupSchema(db, module):
status = module.Class(db, "status", name=String())
session = module.Class(db, 'session', title=String())
session.disableJournalling()
db.post_init()
- status.create(name="unread")
- status.create(name="in-progress")
- status.create(name="testing")
- status.create(name="resolved")
- user.create(username='one')
- user.create(username='two')
db.commit()
-class config:
- DATABASE='_test_dir'
- GADFLY_DATABASE = ('test', DATABASE)
- MAILHOST = 'localhost'
- MAIL_DOMAIN = 'fill.me.in.'
- TRACKER_NAME = 'Roundup issue tracker'
- TRACKER_EMAIL = 'issue_tracker@%s'%MAIL_DOMAIN
- TRACKER_WEB = 'http://some.useful.url/'
- ADMIN_EMAIL = 'roundup-admin@%s'%MAIL_DOMAIN
- FILTER_POSITION = 'bottom' # one of 'top', 'bottom', 'top and bottom'
- ANONYMOUS_ACCESS = 'deny' # either 'deny' or 'allow'
- ANONYMOUS_REGISTER = 'deny' # either 'deny' or 'allow'
- MESSAGES_TO_AUTHOR = 'no' # either 'yes' or 'no'
- EMAIL_SIGNATURE_POSITION = 'bottom'
-
def main(backendname, time=time.time, numissues=10):
try:
exec('from roundup.backends import %s as backend'%backendname)
except ImportError:
return
- if os.path.exists(config.DATABASE):
- shutil.rmtree(config.DATABASE)
-
times = []
- db = backend.Database(config, 'test')
- setupSchema(db, backend)
- # create a whole bunch of stuff
- for i in range(numissues):
- db.issue.create(**{'title': 'issue %s'%i})
- for j in range(10):
- db.issue.set(str(i+1), status='2', assignedto='2', nosy=[])
- db.issue.set(str(i+1), status='1', assignedto='1', nosy=['1','2'])
- db.user.create(**{'username': 'user %s'%i})
- for j in range(10):
- db.user.set(str(i+1), assignable=1)
- db.user.set(str(i+1), assignable=0)
- db.commit()
+ config.DATABASE = os.path.join('_benchmark', '%s-%s'%(backendname,
+ numissues))
+ if not os.path.exists(config.DATABASE):
+ db = backend.Database(config, 'admin')
+ setupSchema(db, backend)
+ # create a whole bunch of stuff
+ db.user.create(**{'username': 'admin'})
+ db.status.create(name="unread")
+ db.status.create(name="in-progress")
+ db.status.create(name="testing")
+ db.status.create(name="resolved")
+ pc = -1
+ for i in range(numissues):
+ db.user.create(**{'username': 'user %s'%i})
+ for j in range(10):
+ db.user.set(str(i+1), assignable=1)
+ db.user.set(str(i+1), assignable=0)
+ db.issue.create(**{'title': 'issue %s'%i})
+ for j in range(10):
+ db.issue.set(str(i+1), status='2', assignedto='2', nosy=[])
+ db.issue.set(str(i+1), status='1', assignedto='1',
+ nosy=['1','2'])
+ if (i*100/numissues) != pc:
+ pc = (i*100/numissues)
+ sys.stdout.write("%d%%\r"%pc)
+ sys.stdout.flush()
+ db.commit()
+ else:
+ db = backend.Database(config, 'admin')
+ setupSchema(db, backend)
+
sys.stdout.write('%7s: %-6d'%(backendname, numissues))
sys.stdout.flush()
times.append(('start', time()))
# fetch
+ db.clearCache()
for i in db.issue.list():
db.issue.get(i, 'title')
times.append(('fetch', time()))
# journals
+ db.clearCache()
for i in db.issue.list():
db.issue.history(i)
times.append(('journal', time()))
# "calculated" props
+ db.clearCache()
for i in db.issue.list():
db.issue.get(i, 'activity')
db.issue.get(i, 'creator')
times.append(('jprops', time()))
# lookup
+ db.clearCache()
for i in range(numissues):
db.user.lookup('user %s'%i)
times.append(('lookup', time()))
# filter
+ db.clearCache()
+ for i in range(100):
+ db.issue.filter(None, {'assignedto': '1', 'title':'issue'},
+ ('+', 'activity'), ('+', 'status'))
+ times.append(('filter', time()))
+
+ # filter with multilink
+ db.clearCache()
for i in range(100):
db.issue.filter(None, {'nosy': ['1'], 'assignedto': '1',
'title':'issue'}, ('+', 'activity'), ('+', 'status'))
- times.append(('filter', time()))
+ times.append(('filtml', time()))
# results
last = None
if __name__ == '__main__':
# 0 1 2 3 4 5 6
# 01234567890123456789012345678901234567890123456789012345678901234
- print 'Test name fetch journl jprops lookup filter TOTAL '
- for name in 'anydbm bsddb bsddb3 metakit sqlite'.split():
+ print 'Test name fetch journl jprops lookup filter filtml TOTAL '
+ for name in 'anydbm metakit sqlite'.split():
main(name)
- for name in 'anydbm bsddb bsddb3 metakit sqlite'.split():
+ for name in 'anydbm metakit sqlite'.split():
main(name, numissues=20)
-# for name in 'anydbm bsddb bsddb3 metakit sqlite'.split():
-# main(name, numissues=100)
+ for name in 'anydbm metakit sqlite'.split():
+ main(name, numissues=100)
+ # don't even bother benchmarking the dbm backends > 100!
+ for name in 'metakit sqlite'.split():
+ main(name, numissues=1000)
+# vim: set et sts=4 sw=4 :