diff test/benchmark.py @ 7876:7a3392f1f7ac

test: update benchmark add basic CLI support for backend arguments Also docstring for file. Handle ^C interruption and cleanup partly created databases. Support postgresql and mysql.
author John Rouillard <rouilj@ieee.org>
date Tue, 16 Apr 2024 22:19:29 -0400
parents 867418c24339
children 9c3ec0a5c7fc
line wrap: on
line diff
--- a/test/benchmark.py	Sun Apr 14 20:08:29 2024 -0400
+++ b/test/benchmark.py	Tue Apr 16 22:19:29 2024 -0400
@@ -1,3 +1,26 @@
+""" Usage: python benchmark.py ["database backend list" | backend1] [backend2]
+
+Import the backend (anydbm, sqlite by default) and run some performance
+tests. Example:
+
+test default anypy and sqlite backends
+
+  python benchmark.py
+
+test mysql and sqlite backends
+
+  python benchmark.py mysql sqlite
+
+or
+
+  python benchmark.py "mysql sqlite"
+
+test all backends
+
+  python benchmark.py anydbm mysql postgresql sqlite
+
+
+"""
 from __future__ import print_function
 import sys, os, time
 import importlib, signal, shutil
@@ -17,6 +40,8 @@
 
 from test.db_test_base import config
 
+# global for the default signal hander so
+# my signal handler can reset before it raises signal.
 int_sig_default_handler = None
 
 def setupSchema(db, module):
@@ -38,26 +63,39 @@
 def rm_db_on_signal(sig, frame):
     print("removing incomplete database %s due to interruption." %
           config.DATABASE)
+
     shutil.rmtree(config.DATABASE)
+
     signal.signal(signal.SIGINT, int_sig_default_handler)
+    # re-raise the signal so the normal signal handling runs.
     signal.raise_signal(signal.SIGTERM)
 
 def main(backendname, time=time.time, numissues=10):
     global int_sig_default_handler
+
     try:
         backend = importlib.import_module("roundup.backends.back_%s" %
                                           backendname)
     except ImportError:
+        print("Unable to import %s backend." % backendname)
         return
 
     times = []
 
     config.DATABASE = os.path.join('_benchmark', '%s-%s'%(backendname,
         numissues))
+
+    config.RDBMS_NAME = "rounduptest_%s" % numissues
+
     if not os.path.exists(config.DATABASE):
         int_sig_default_handler = signal.signal(signal.SIGINT, rm_db_on_signal)
         db = backend.Database(config, 'admin')
         setupSchema(db, backend)
+
+        # if we are re-initializing, delete any existing db
+        db.clear()
+        db.commit()
+
         # create a whole bunch of stuff
         db.user.create(**{'username': 'admin', 'roles': 'Admin'})
         db.status.create(name="unread")
@@ -85,7 +123,7 @@
         db = backend.Database(config, 'admin')
         setupSchema(db, backend)
 
-    sys.stdout.write('%7s: %-6d'%(backendname, numissues))
+    sys.stdout.write('%10s: %-6d'%(backendname[:10], numissues))
     sys.stdout.flush()
 
     times.append(('start', time()))
@@ -142,17 +180,35 @@
     sys.stdout.flush()
 
 if __name__ == '__main__':
+    if len(sys.argv) == 2:
+        test_databases = sys.argv[1].split()
+    elif len(sys.argv) > 2:
+        test_databases = sys.argv[1:]
+    else:
+        test_databases = ['anydbm', 'sqlite']
+
     #      0         1         2         3         4         5         6
     #      01234567890123456789012345678901234567890123456789012345678901234
-    print('Test name       fetch  journl jprops lookup filter filtml TOTAL ')
-    for name in 'anydbm sqlite'.split():
+    print('Test name         fetch  journl jprops lookup filter filtml TOTAL ')
+    for name in test_databases:
         main(name)
-    for name in 'anydbm sqlite'.split():
+    for name in test_databases:
         main(name, numissues=20)
-    for name in 'anydbm sqlite'.split():
+    for name in test_databases:
         main(name, numissues=100)
+
     # don't even bother benchmarking the dbm backends > 100!
-    for name in 'sqlite'.split():
+    try:
+        test_databases.remove('anydbm')
+    except ValueError:
+        # anydbm not present; this is fine
+        pass
+
+    for name in test_databases:
         main(name, numissues=1000)
 
+    for name in test_databases:
+        main(name, numissues=10000)
+
+
 # vim: set et sts=4 sw=4 :

Roundup Issue Tracker: http://roundup-tracker.org/