1 2import re, datetime 3import tests, debug 4from common import TestCommon 5from results import PassFailResult, RowResults 6from itertools import product 7 8@tests.add_test 9class MdbBench(TestCommon): 10 '''mdbbench''' 11 name = "mdbbench" 12 13 #resets = ["random_nat_ram", "propszrand_nat_ram", "szprob_cp_nat_ram"] 14 resets = ["szprob_cp_nat_ram"] 15 counts = [1<<x for x in range(5, 13+1)] 16 #counts = [1<<10] 17 impls = ["mdb_bench", "mdb_bench_old"] 18 measures = [ 19 "insert_one", 20 "remove_one", 21 "iterate_1", 22 "iterate_10", 23 "iterate_100", 24 "iterate_1000", 25 "has_copies", 26 "has_ancestors", 27 "has_descendants", 28 ] 29 impl_measures = { 30 "mdb_bench": [ 31 "query_address" 32 ], 33 } 34 dump = True 35 36 def get_build_targets(self, build, machine): 37 targets = super(MdbBench, self).get_build_targets(build, machine) 38 for impl in self.impls: 39 targets.append('%s/sbin/%s' % (machine.get_bootarch(), impl)) 40 return targets 41 42 def run_one(self, build, machine, testdir, count, measure, reset, impl, runs): 43 debug.log('running %s m=%s c=%s' % (impl, measure, count)) 44 yield "[mdb_bench of %s]\n" % impl 45 modules = self.get_modules(build, machine) 46 bench_args = ["count=%s"%count, "reset=%s"%reset, "runs=%d"%runs, "measure=%s"%measure] 47 modules.add_module(impl, bench_args) 48 self.boot(machine, modules) 49 self.set_timeout(datetime.timedelta(hours=1)) 50 for line in self.collect_data(machine): 51 yield line 52 53 def run(self, build, machine, testdir): 54 for c, m, r, i in product(self.counts, self.measures, self.resets, self.impls): 55 for l in self.run_one(build, machine, testdir, c, m, r, i, 1000): 56 yield l 57 58 for i in set(self.impls) & set(self.impl_measures.keys()): 59 for c, m, r in product(self.counts, self.impl_measures[i], self.resets): 60 for l in self.run_one(build, machine, testdir, c, m, r, i, 1000): 61 yield l 62 63 if self.dump: 64 for c, r in product(self.counts, self.resets): 65 for l in self.run_one(build, machine, testdir, c, "dump", r, "mdb_bench", 10): 66 yield l 67 68 def process_data(self, testdir, rawiter): 69 results = RowResults(['impl', 'reset', 'measure', 'count', 'ticks']) 70 caps = RowResults(['run', 'reset', 'count', 'base', 'bits', 'flags'], name="caps") 71 impl = None 72 reset = None 73 measure = None 74 count = None 75 dumping = False 76 for line in rawiter: 77 m = re.match(r"\[mdb_bench of (\w+)\]", line) 78 if m: 79 impl = m.group(1) 80 continue 81 m = re.match(r"\[mdb_bench dumping\]", line) 82 if m: 83 dumping = True 84 if self.boot_phase: 85 continue 86 m = re.match(r"([^:/]+)/(\d+):dump:([^:]+): 0x([0-9a-fA-F]+)/(\d+) ([c.][a.][d.])", line) 87 if m: 88 caps.add_row([m.group(3), m.group(1), m.group(2), m.group(4), m.group(5), m.group(6)]) 89 continue 90 m = re.match(r"([^:]+):([^:]+): (\d+)/(\d+)", line) 91 if m: 92 reset = m.group(1) 93 measure = m.group(2) 94 count = m.group(4) 95 ticks = m.group(3) 96 results.add_row([impl, reset, measure, count, ticks]) 97 continue 98 99 results = [results] 100 if dumping: 101 results.append(caps) 102 return results 103