From 784eaa108a543602e4e7ad42828e8720106fd26d Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Sat, 3 Nov 2007 22:03:18 +0000 Subject: [PATCH] Added a profiled benchmark for orm attribute modification & flush --- test/perf/objupdatespeed.py | 93 +++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 test/perf/objupdatespeed.py diff --git a/test/perf/objupdatespeed.py b/test/perf/objupdatespeed.py new file mode 100644 index 0000000000..d355d5ece4 --- /dev/null +++ b/test/perf/objupdatespeed.py @@ -0,0 +1,93 @@ +import testbase +import time, gc, resource +from sqlalchemy import * +from sqlalchemy.orm import * +from testlib import * + +NUM = 100 + +metadata = MetaData(testbase.db) +Person_table = Table('Person', metadata, + Column('id', Integer, primary_key=True), + Column('name', String(40)), + Column('sex', Integer), + Column('age', Integer)) + +Email_table = Table('Email', metadata, + Column('id', Integer, primary_key=True), + Column('person_id', Integer, ForeignKey('Person.id')), + Column('address', String(300))) + +class Person(object): + pass +class Email(object): + def __repr__(self): + return '' % (getattr(self, 'id', None), + getattr(self, 'address', None)) + +mapper(Person, Person_table, properties={ + 'emails': relation(Email, backref='owner', lazy=False) + }) +mapper(Email, Email_table) +compile_mappers() + +def setup(): + metadata.create_all() + i = Person_table.insert() + data = [{'name':'John Doe','sex':1,'age':35}] * NUM + i.execute(data) + + i = Email_table.insert() + for j in xrange(1, NUM + 1): + i.execute(address='foo@bar', person_id=j) + if j % 2: + i.execute(address='baz@quux', person_id=j) + + print "Inserted %d rows." % (NUM + NUM + (NUM // 2)) + +def orm_select(session): + return session.query(Person).all() + +@profiling.profiled('update_and_flush') +def update_and_flush(session, people): + for p in people: + p.name = 'Exene Cervenka' + p.sex = 2 + p.emails[0].address = 'hoho@lala' + session.flush() + +def all(): + setup() + try: + t, t2 = 0, 0 + def usage(label): + now = resource.getrusage(resource.RUSAGE_SELF) + print "%s: %0.3fs real, %0.3fs user, %0.3fs sys" % ( + label, t2 - t, + now.ru_utime - usage.last.ru_utime, + now.ru_stime - usage.last.ru_stime) + usage.snap(now) + usage.snap = lambda stats=None: setattr( + usage, 'last', stats or resource.getrusage(resource.RUSAGE_SELF)) + + session = create_session() + + gc.collect() + usage.snap() + t = time.clock() + people = orm_select(session) + t2 = time.clock() + usage('load objects') + + gc.collect() + usage.snap() + t = time.clock() + update_and_flush(session, people) + t2 = time.clock() + usage('update and flush') + finally: + metadata.drop_all() + + +if __name__ == '__main__': + all() -- 2.47.3