普通文本  |  51行  |  1.48 KB

import os
import re
from autotest_lib.client.bin import test
from autotest_lib.client.bin import utils

import tracers
import base_tracer

class tracing_microbenchmark(test.test):
    version = 1
    preserve_srcdir = True

    def setup(self):
        os.chdir(self.srcdir)
        utils.system('make CROSS_COMPILE=""')

    def initialize(self, tracer='ftrace', calls=100000, **kwargs):
        self.job.require_gcc()
        tracer_class = getattr(tracers, tracer)
        if not issubclass(tracer_class, base_tracer.Tracer):
            raise TypeError
        self.tracer = tracer_class()

        getuid_microbench = os.path.join(self.srcdir, 'getuid_microbench')
        self.cmd = '%s %d' % (getuid_microbench, calls)

    def warmup(self, buffer_size_kb=8000, **kwargs):
        self.tracer.warmup(buffer_size_kb)

    def cleanup(self):
        self.tracer.cleanup()

    def run_once(self, **kwargs):
        self.results = {}

        self.tracer.start_tracing()
        self.cmd_result = utils.run(self.cmd)
        self.tracer.stop_tracing()

        self.tracer.gather_stats(self.results)
        self.tracer.reset_tracing()

    def postprocess_iteration(self):
        result_re = re.compile(r'(?P<calls>\d+) calls '
                               r'in (?P<time>\d+\.\d+) s '
                               '\((?P<ns_per_call>\d+\.\d+) ns/call\)')
        match = result_re.match(self.cmd_result.stdout)
        self.results.update(match.groupdict())

        self.write_perf_keyval(self.results)