X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=test%2Fbenchmark.py;h=b42a7a2ae4c0a2d068407624fb493ebcee8e0137;hb=d5597ec3a5458ae238e653aff0b333b44ad165a2;hp=496ce65542430b2d0da18e0b70bd63575f0e67fa;hpb=e8ba7d283909bef6f2b06af2bb23f687640de19a;p=roundup.git diff --git a/test/benchmark.py b/test/benchmark.py index 496ce65..b42a7a2 100644 --- a/test/benchmark.py +++ b/test/benchmark.py @@ -1,9 +1,10 @@ -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()) @@ -19,69 +20,66 @@ def setupSchema(db, module): 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') @@ -89,15 +87,24 @@ def main(backendname, time=time.time, numissues=10): 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 @@ -113,11 +120,15 @@ def main(backendname, time=time.time, numissues=10): 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 :