andy0130tw
11/25/2015 - 5:59 PM

DSnP ADT benchmark

DSnP ADT benchmark

#!/usr/bin/env python3
from subprocess import Popen, PIPE, STDOUT, TimeoutExpired
import re
import argparse
import time

proc_name = 'adtTest'
proc_ext_avail = ['dlist', 'array', 'bst']
proc_ext_do = []
repeat = 5
magnititudes = [ int(n) for n in [1e4, 3e4, 1e5, 3e5, 1e6, 3e6, 1e7] ]
timeout = 300

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('dofile', help='the dofile name inside ./benchmarks to test.\
 __N__ inside files are substituted with different magnititudes.')
    parser.add_argument('-d', '--dlist', action="store_true", help='only perform tests on dlist')
    parser.add_argument('-a', '--array', action="store_true", help='only perform tests on array')
    parser.add_argument('-b', '--bst', action="store_true", help='only perform tests on BST')
    args = parser.parse_args()

    do_in = open('./tests/' + args.dofile, 'r').read()
    verdict = open('./benchmarks/' + args.dofile + '.log', 'w')

    proc_ext_do = []
    for ext in proc_ext_avail:
        if getattr(args, ext):
            proc_ext_do.append(ext)
    if not len(proc_ext_do):  # no ext provided mean all
        proc_ext_do = proc_ext_avail

    for ext in proc_ext_do:
        for N in magnititudes:
            print('Testing {}, preforming N={}:'.format(ext, N))

            for _ in range(repeat):
                print('  #{}... '.format(_), end='', flush=True)
                do_content = re.sub(r'__N__', str(N), do_in)
                ts = time.time()
                proc = Popen(['{}/{}.{}'.format('./', proc_name, ext)], stdin=PIPE, stdout=PIPE, stderr=STDOUT)

                verdict.write('======== {} :: {} :: {} ========\n'.format(ext, N, _))
                killed = 0

                try:
                    outs, errs = proc.communicate(do_content.encode(), timeout)
                    print('OK. {:.3f} ms'.format(time.time() - ts))
                except TimeoutExpired:
                    outs, errs = proc.communicate()
                    print('Killed... ')
                    killed = 1

                verdict.write(outs.decode('utf-8'))

                if killed:
                    verdict.write('\n##### KILLED after {} sec #####\n'.format(timeout))

if __name__ == '__main__':
    main()