From: Jason Kirtland Date: Sat, 22 Sep 2007 18:03:27 +0000 (+0000) Subject: Added. X-Git-Tag: rel_0_4beta6~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=75c2230476029916399a355aaa34a59fad62e196;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Added. --- diff --git a/test/perf/objselectspeed.py b/test/perf/objselectspeed.py new file mode 100644 index 0000000000..905632ef21 --- /dev/null +++ b/test/perf/objselectspeed.py @@ -0,0 +1,104 @@ +import testbase +import time, gc, resource +from sqlalchemy import * +from sqlalchemy.orm import * +from testlib import * + +db = create_engine('sqlite://') +metadata = MetaData(db) +Person_table = Table('Person', metadata, + Column('id', Integer, primary_key=True), + Column('name', String(40)), + Column('sex', Integer), + Column('age', Integer)) + +class RawPerson(object): pass +class Person(object): pass +mapper(Person, Person_table) +compile_mappers() + +def setup(): + metadata.create_all() + i = Person_table.insert() + data = [{'name':'John Doe','sex':1,'age':35}] * 100 + for j in xrange(500): + i.execute(data) + print "Inserted 50,000 rows" + +def sqlite_select(entity_cls): + conn = db.connect().connection + cr = conn.cursor() + cr.execute("SELECT id, name, sex, age FROM Person") + people = [] + for row in cr.fetchall(): + person = entity_cls() + person.id = row[0] + person.name = row[1] + person.sex = row[2] + person.age = row[3] + people.append(person) + cr.close() + conn.close() + +def sql_select(entity_cls): + people = [] + for row in Person_table.select().execute().fetchall(): + person = entity_cls() + person.id = row.id + person.name = row.name + person.sex = row.sex + person.age = row.age + people.append(person) + +def orm_select(): + session = create_session() + people = session.query(Person).all() + +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.last = now + usage.last = resource.getrusage(resource.RUSAGE_SELF) + + gc.collect() + t = time.clock() + sqlite_select(RawPerson) + t2 = time.clock() + usage('sqlite select/native') + + gc.collect() + t = time.clock() + sqlite_select(Person) + t2 = time.clock() + usage('sqlite select/instrumented') + + gc.collect() + t = time.clock() + sql_select(RawPerson) + t2 = time.clock() + usage('sqlalchemy.sql select/native') + + gc.collect() + t = time.clock() + sql_select(Person) + t2 = time.clock() + usage('sqlalchemy.sql select/instrumented') + + gc.collect() + t = time.clock() + orm_select() + t2 = time.clock() + usage('sqlalchemy.orm fetch') + finally: + metadata.drop_all() + + +if __name__ == '__main__': + all()