new_contents: import testenv; testenv.configure_for_tests()
  from sqlalchemy import *
  from sqlalchemy.orm import *
  from testlib import *
  from testlib import fixtures
  import gc
  
  # in this test we are specifically looking for time spent in the attributes.InstanceState.__cleanup() method.
  
  ITERATIONS = 100
  
  class SessionTest(AssertMixin):
      def setUpAll(self):
          global t1, t2, metadata,T1, T2
          metadata = MetaData(testing.db)
          t1 = Table('t1', metadata,
              Column('c1', Integer, primary_key=True),
              Column('c2', String(30)))
  
          t2 = Table('t2', metadata,
              Column('c1', Integer, primary_key=True),
              Column('c2', String(30)),
              Column('t1id', Integer, ForeignKey('t1.c1'))
              )
          
          metadata.create_all()
  
          l = []
          for x in range(1,51):
              l.append({'c2':'this is t1 #%d' % x})
          t1.insert().execute(*l)
          for x in range(1, 51):
              l = []
              for y in range(1, 100):
                  l.append({'c2':'this is t2 #%d' % y, 't1id':x})
              t2.insert().execute(*l)
          
          class T1(fixtures.Base):
              pass
          class T2(fixtures.Base):
              pass
  
          mapper(T1, t1, properties={
              't2s':relation(T2, backref='t1')
          })
          mapper(T2, t2)
      
      def tearDownAll(self):
          metadata.drop_all()
          clear_mappers()
          
      @profiling.profiled('clean', report=True)
      def test_session_clean(self):
          for x in range(0, ITERATIONS):
              sess = create_session()
              t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
              for index in [2, 7, 12, 15, 18, 20]:
                  t1s[index].t2s
  
              sess.close()
              del sess
              gc.collect()
  
      @profiling.profiled('dirty', report=True)
      def test_session_dirty(self):
          for x in range(0, ITERATIONS):
              sess = create_session()
              t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
              
              for index in [2, 7, 12, 15, 18, 20]:
                  t1s[index].c2 = 'this is some modified text'
                  for t2 in t1s[index].t2s:
                      t2.c2 = 'this is some modified text'
  
              del t1s
              gc.collect()
              
              sess.close()
              del sess
              gc.collect()
  
      @profiling.profiled('noclose', report=True)
      def test_session_noclose(self):
          for x in range(0, ITERATIONS):
              sess = create_session()
              t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
              for index in [2, 7, 12, 15, 18, 20]:
                  t1s[index].t2s
  
              del sess
              gc.collect()
          
  
  
  if __name__ == '__main__':
      testenv.main()
  
subject: test for session close efficiency