- Instead of having a single integer, each entity has a text with 10,000 characters
- A half of records is written in transactions by 10 records, and another half - record by record
Also, this time I had a huge difference between the real appengine server and dev_appserver after having many records in the database (real server was much faster). Grouping few records in a transaction also helped. This is the test code:
from google.appengine.ext import db from time import time print 'Content-Type: text/plain' print '' total_t=time() class Root(db.Model): pass class C(db.Model): i=db.TextProperty() t1000="a"*10000 def add_in_transaction(root, text, amount): for j in range(amount): c=C(parent=root, i=text) c.put() print "with transactions - big" for i in range(5): t=time() root=Root() root.put() db.run_in_transaction(add_in_transaction, root, t1000, 10) print time()-t print "without transactions - big" for i in range(5): t=time() root=Root() root.put() add_in_transaction(None, t1000, 10) print time()-t print "without transactions - small" for i in range(5): t=time() root=Root() root.put() add_in_transaction(None, "a", 10) print time()-t print "total time:", time()-total_tAnd this is the result
with transactions - big 0.161096096039 0.154489994049 0.367100000381 0.152635812759 0.153033971786 without transactions - big 0.315757989883 0.359083890915 0.559228181839 0.360776901245 0.330877780914 without transactions - small 0.279601812363 0.541454076767 0.324053049088 0.311630964279 0.306309938431 total time: 4.67810916901I think it's worth to open a bug on appengine documentation so they mention these performance considerations.
P.S. changed the test a little to demonstrate that writing one character or 10K characters has no difference.