Mercurial > p > roundup > code
view test/benchmark.py @ 1797:c1eec970d5c0
Optimize mailgw and cgi tests...
...by creating an empty instance before the tests start (only if
needed). In setUp(), this instance is then copied to another directory
for the actual tests.
On my system, this about halved the execution time for test_cgi (33s -> 14s)
and test_mailgw (40s -> 25s).
| author | Johannes Gijsbers <jlgijsbers@users.sourceforge.net> |
|---|---|
| date | Sun, 07 Sep 2003 20:37:33 +0000 |
| parents | 69bf0d381fd7 |
| children | 91d4d28c4a86 |
line wrap: on
line source
import sys, os, time, shutil from roundup.hyperdb import String, Password, Link, Multilink, Date, \ Interval, DatabaseError, Boolean, Number from roundup import date, password from roundup.indexer import Indexer def setupSchema(db, module): status = module.Class(db, "status", name=String()) status.setkey("name") user = module.Class(db, "user", username=String(), password=Password(), assignable=Boolean(), age=Number(), roles=String()) user.setkey("username") file = module.FileClass(db, "file", name=String(), type=String(), comment=String(indexme="yes")) issue = module.IssueClass(db, "issue", title=String(indexme="yes"), status=Link("status"), nosy=Multilink("user"), deadline=Date(), foo=Interval(), files=Multilink("file"), assignedto=Link('user')) session = module.Class(db, 'session', title=String()) session.disableJournalling() db.post_init() db.commit() class config: DATABASE='_benchmark' 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 times = [] 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') db.issue.get(i, 'creation') 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(('filtml', time())) # results last = None for event, stamp in times: if last is None: first = stamp else: sys.stdout.write(' %-6.2f'%(stamp-last)) last = stamp print ' %-6.2f'%(last-first) sys.stdout.flush() if __name__ == '__main__': # 0 1 2 3 4 5 6 # 01234567890123456789012345678901234567890123456789012345678901234 print 'Test name fetch journl jprops lookup filter filtml TOTAL ' for name in 'anydbm bsddb bsddb3 metakit sqlite'.split(): main(name) for name in 'anydbm bsddb bsddb3 metakit sqlite'.split(): main(name, numissues=20) for name in 'anydbm bsddb bsddb3 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)
