added test case to monitor speed improvements in the repository code.
To use it, add a test in a patch, then hack CW to speed it up in another patch,
updating the test if needed. By running the test with and without the second
patch applied you can easily see the speed improvements
--- a/server/test/data/schema.py Wed Apr 20 08:28:52 2011 +0200
+++ b/server/test/data/schema.py Fri Apr 15 16:05:20 2011 +0200
@@ -220,3 +220,15 @@
class require_state(RelationDefinition):
subject = 'CWPermission'
object = 'State'
+
+class personne_composite(RelationDefinition):
+ subject='Personne'
+ object='Personne'
+ composite='subject'
+
+class personne_inlined(RelationDefinition):
+ subject='Personne'
+ object='Personne'
+ cardinality='?*'
+ inlined=True
+
--- a/server/test/unittest_repository.py Wed Apr 20 08:28:52 2011 +0200
+++ b/server/test/unittest_repository.py Fri Apr 15 16:05:20 2011 +0200
@@ -685,5 +685,77 @@
req.cnx.commit()
self.assertEqual(cm.exception.errors, {'inline1-subject': u'RQLUniqueConstraint S type T, S inline1 A1, A1 todo_by C, Y type T, Y inline1 A2, A2 todo_by C failed'})
+
+
+class PerformanceTest(CubicWebTC):
+ def setup_database(self):
+ import logging
+ logger = logging.getLogger('cubicweb.session')
+ #logger.handlers = [logging.StreamHandler(sys.stdout)]
+ logger.setLevel(logging.INFO)
+ self.info = logger.info
+
+ def test_composite_deletion(self):
+ req = self.request()
+ personnes = []
+ t0 = time.time()
+ for i in xrange(2000):
+ p = req.create_entity('Personne', nom=u'Doe%03d'%i, prenom=u'John', sexe=u'M')
+ personnes.append(p)
+ abraham = req.create_entity('Personne', nom=u'Abraham', prenom=u'John', sexe=u'M')
+ for j in xrange(0, 2000, 100):
+ abraham.set_relations(personne_composite=personnes[j:j+100])
+ t1 = time.time()
+ self.info('creation: %.2gs', (t1 - t0))
+ req.cnx.commit()
+ t2 = time.time()
+ self.info('commit creation: %.2gs', (t2 - t1))
+ self.execute('DELETE Personne P WHERE P eid %(eid)s', {'eid': abraham.eid})
+ t3 = time.time()
+ self.info('deletion: %.2gs', (t3 - t2))
+ req.cnx.commit()
+ t4 = time.time()
+ self.info("commit deletion: %2gs", (t4 - t3))
+
+ def test_add_relation_non_inlined(self):
+ req = self.request()
+ personnes = []
+ for i in xrange(2000):
+ p = req.create_entity('Personne', nom=u'Doe%03d'%i, prenom=u'John', sexe=u'M')
+ personnes.append(p)
+ req.cnx.commit()
+ t0 = time.time()
+ abraham = req.create_entity('Personne', nom=u'Abraham', prenom=u'John', sexe=u'M',
+ personne_composite=personnes[:100])
+ t1 = time.time()
+ self.info('creation: %.2gs', (t1 - t0))
+ for j in xrange(100, 2000, 100):
+ abraham.set_relations(personne_composite=personnes[j:j+100])
+ t2 = time.time()
+ self.info('more relations: %.2gs', (t2-t1))
+ req.cnx.commit()
+ t3 = time.time()
+ self.info('commit creation: %.2gs', (t3 - t2))
+
+ def test_add_relation_inlined(self):
+ req = self.request()
+ personnes = []
+ for i in xrange(2000):
+ p = req.create_entity('Personne', nom=u'Doe%03d'%i, prenom=u'John', sexe=u'M')
+ personnes.append(p)
+ req.cnx.commit()
+ t0 = time.time()
+ abraham = req.create_entity('Personne', nom=u'Abraham', prenom=u'John', sexe=u'M',
+ personne_inlined=personnes[:100])
+ t1 = time.time()
+ self.info('creation: %.2gs', (t1 - t0))
+ for j in xrange(100, 2000, 100):
+ abraham.set_relations(personne_inlined=personnes[j:j+100])
+ t2 = time.time()
+ self.info('more relations: %.2gs', (t2-t1))
+ req.cnx.commit()
+ t3 = time.time()
+ self.info('commit creation: %.2gs', (t3 - t2))
+
if __name__ == '__main__':
unittest_main()