# # # patch "mtn_benchmark/instrumenter.py" # from [b01b9f0257cc593bba87944c1ddd9fc3b30fd858] # to [04ce480f657a22ddc2c4a5ff859bc5193eabbf6d] # # patch "mtn_benchmark/instrumenters.py" # from [4c10911d5a88cf39d15b8920fa657db1a2bc011b] # to [c83951fd21df776ef995bd798609df9b155f4ac6] # ============================================================ --- mtn_benchmark/instrumenter.py b01b9f0257cc593bba87944c1ddd9fc3b30fd858 +++ mtn_benchmark/instrumenter.py 04ce480f657a22ddc2c4a5ff859bc5193eabbf6d @@ -39,12 +39,20 @@ os.kill(self.popen.pid, 9) class Instrumenter(object): - def __init__(self, klass, repeats=1): + # the class to construct + objclass = None + # default repeats, override in subclass if you want a different default + repeats = 1 + + def __init__(self, klass, **kwargs): self.klass = klass - self.repeats = repeats + if "repeats" in kwargs: + self.repeats = kwargs["repeats"] + del kwargs["repeats"] + self.kwargs = kwargs def new(self, record_dir): - return self.klass(record_dir) + return self.klass(record_dir, **kwargs) class InstrumenterObj(object): def __init__(self, record_dir): ============================================================ --- mtn_benchmark/instrumenters.py 4c10911d5a88cf39d15b8920fa657db1a2bc011b +++ mtn_benchmark/instrumenters.py c83951fd21df776ef995bd798609df9b155f4ac6 @@ -1,9 +1,9 @@ import os import os.path import mtn_benchmark.instrumenter as instrumenter -def NullInstrumenter(): - return instrumenter.Instrumenter(instrumenter.InstrumenterObj, 1) +class NullInstrumenter(instrumenter.Instrumenter): + objclass = instrumenter.InstrumenterObj class TimingInstrumenterObj(instrumenter.RecordingInstrumenterObj): def parse_time_str(self, s): @@ -35,41 +35,41 @@ return process -def TimingInstrumenter(repeats=3): - return instrumenter.Instrumenter(TimingInstrumenterObj, repeats) +class TimingInstrumenter(instrumenter.Instrumenter): + repeats = 3 + objclass = TimingInstrumenterObj class MemTimingInstrumenterObj(instrumenter.RecordingInstrumenterObj): + def __init__(self, record_dir, path=None): + super(MemTimingInstrumenterObj, self).__init__(record_dir) + if path is None: + sys.exit(type(self).__name__ + " needs a path to the memtimer as path=") + self.memtime = os.path.abspath(path) + if not os.path.exists(memtime): + sys.exit("memtime executable isn't where you claimed: %s" % self.memtime) + def run_bg(self, name, cmd): - memtime = os.path.abspath("../../../memtime"); - if not os.path.exists(memtime): - os.system("pwd") - print "memtime not in ../../.. directory, doesn't know how to pass the argument through to the class" - sys.exit(1) - my_cmd = [memtime, "-o", "timings-" + name] + cmd - def timing_hook(result): - timing_file = open("timings-" + name, "r") - for line in timing_file: - if line.startswith("STATS_MACHINE_V1:"): - break - assert line.startswith("STATS_MACHINE_V1:") - junk, user, sys, wall, max_size_bytes, max_resident_bytes, avg_size_bytes, avg_resident_bytes = line.split() - self.record_stat(name + "-user-time", user) - self.record_stat(name + "-system-time", sys) - self.record_stat(name + "-wall-time", wall) - self.record_stat(name + "-max-size-MiB", float(max_size_bytes) / (1024*1024)) - self.record_stat(name + "-max-resident-MiB", float(max_resident_bytes) / (1024*1024)) - self.record_stat(name + "-avg-size-MiB", float(avg_size_bytes) / (1024*1024)) - self.record_stat(name + "-avg-resident-MiB", float(avg_resident_bytes) / (1024*1024)) - - process = super(MemTimingInstrumenterObj, self).run_bg(name, my_cmd) - process.hook(timing_hook) - return process + my_cmd = [self.memtime, "-o", "timings-" + name] + cmd + def timing_hook(result): + timing_file = open("timings-" + name, "r") + for line in timing_file: + if line.startswith("STATS_MACHINE_V1:"): + break + assert line.startswith("STATS_MACHINE_V1:") + junk, user, sys, wall, max_size_bytes, max_resident_bytes, avg_size_bytes, avg_resident_bytes = line.split() + self.record_stat(name + "-user-time", user) + self.record_stat(name + "-system-time", sys) + self.record_stat(name + "-wall-time", wall) + self.record_stat(name + "-max-size-MiB", float(max_size_bytes) / (1024*1024)) + self.record_stat(name + "-max-resident-MiB", float(max_resident_bytes) / (1024*1024)) + self.record_stat(name + "-avg-size-MiB", float(avg_size_bytes) / (1024*1024)) + self.record_stat(name + "-avg-resident-MiB", float(avg_resident_bytes) / (1024*1024)) + + process = super(MemTimingInstrumenterObj, self).run_bg(name, my_cmd) + process.hook(timing_hook) + return process -# TODO: figure out how to get a path to memtime passed through -def MemTimingInstrumenter(path, repeats=3): - # TODO: get path from here into the object; just putting it in as - # an argument in the next line doesn't work (some error), even - # with an __init__ function in the class - return instrumenter.Instrumenter(MemTimingInstrumenterObj, repeats) +class MemTimingInstrumenter(instrumenter.Instrumenter): + repeats = 3 + objclass = MemTimingInstrumenterObj -