I did some quick and dirty performance tests to measure the time taken
by db.define_table calls.

Test was as follows:
- Run web2py locally, with built-in web server
- Create new application 'perftest' in web2py admin interface
- Add 5 dummy table definitions to db.py, uncomment mail and auth
settings (see copy of my db.py at end of this message)
- Run the HP tool httperf to access perftest home page 1000 times
using the following command:
httperf --hog --server=localhost --port 8000 --uri /perftest/default/
index --num-conns=1000
- Time tests with db.py as defined below, with table definitions
removed, and with db.py file removed completely

To remove the table definitions I commented out the line
'auth.define_tables()' and all lines starting 'db.define_table' in
db.py

For reference I am running Ubuntu Linux (karmic alpha), Intel Dual
Core 2.0Ghz, 4GB RAM. httperf version used is 0.9.0 (available from
synaptic package manager). web2py version 1.66.2, python 2.5

Results - time to receive 1000 pages from web2py built-in webserver:

Not compiled:
Full db.py - 22.4s
No table defs in db.py - 11.5s
No db.py at all 9.6s

Compiled:
Full db.py - 16s
No table defs - 5.7s
No db.py at all 4.1s

This does appear to show there would be a performance benefit to
sharing the db object definitions between page requests.

Yarko - I like your suggestion of putting table definitions in gluon
just as a quick hack to compare performance - I will try this next.

Please find the source of the db.py file I used below:

# coding: utf8

if request.env.web2py_runtime_gae:            # if running on Google
App Engine
    db = DAL('gae')                           # connect to Google
BigTable
    session.connect(request, response, db=db) # and store sessions and
tickets there
else:                                         # else use a normal
relational database
    db = DAL('sqlite://storage.sqlite')       # if not, use SQLite or
other DB

from gluon.tools import *
auth=Auth(globals(),db)                      # authentication/
authorization
auth.settings.hmac_key='6944f00d-1758-41e4-8fdb-625b0be17e1a'
auth.define_tables()                         # creates all needed
tables
crud=Crud(globals(),db)                      # for CRUD helpers using
auth
service=Service(globals())                   # for json, xml, jsonrpc,
xmlrpc, amfrpc
crud.settings.auth=auth                      # enforces authorization
on crud
mail=Mail()                                  # mailer
mail.settings.server='smtp.gmail.com:587'    # your SMTP server
mail.settings.sender='y...@gmail.com'         # your email
mail.settings.login='username:password'      # your credentials or
None
auth.settings.mailer=mail                    # for user email
verification
auth.settings.registration_requires_verification = True
auth.settings.registration_requires_approval = True
auth.messages.verify_email = \
  'Click on the link http://.../user/verify_email/%(key)s to verify
your email'

db.define_table('perftest1',
    SQLField('string1','string'),
    SQLField('text1','text'),
    SQLField('blob1','blob'),
    SQLField('password1','password'),
    SQLField('upload1','upload'),
    SQLField('boolean1','boolean'),
    SQLField('integer1','integer'),
    SQLField('double1','double'),
    SQLField('date1','date'),
    SQLField('time1','time'),
    SQLField('datetime1','datetime'))

db.define_table('perftest2',
    SQLField('string2','string'),
    SQLField('text2','text'),
    SQLField('blob2','blob'),
    SQLField('password2','password'),
    SQLField('upload2','upload'),
    SQLField('boolean2','boolean'),
    SQLField('integer2','integer'),
    SQLField('double2','double'),
    SQLField('date2','date'),
    SQLField('time2','time'),
    SQLField('datetime2','datetime'))

db.define_table('perftest3',
    SQLField('string3','string'),
    SQLField('text3','text'),
    SQLField('blob3','blob'),
    SQLField('password3','password'),
    SQLField('upload3','upload'),
    SQLField('boolean3','boolean'),
    SQLField('integer3','integer'),
    SQLField('double3','double'),
    SQLField('date3','date'),
    SQLField('time3','time'),
    SQLField('datetime3','datetime'))

db.define_table('perftest4',
    SQLField('string4','string'),
    SQLField('text4','text'),
    SQLField('blob4','blob'),
    SQLField('password4','password'),
    SQLField('upload4','upload'),
    SQLField('boolean4','boolean'),
    SQLField('integer4','integer'),
    SQLField('double4','double'),
    SQLField('date4','date'),
    SQLField('time4','time'),
    SQLField('datetime4','datetime'))

db.define_table('perftest5',
    SQLField('string5','string'),
    SQLField('text5','text'),
    SQLField('blob5','blob'),
    SQLField('password5','password'),
    SQLField('upload5','upload'),
    SQLField('boolean5','boolean'),
    SQLField('integer5','integer'),
    SQLField('double5','double'),
    SQLField('date5','date'),
    SQLField('time5','time'),
    SQLField('datetime5','datetime'))
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to