From f12f70c78c80ab02da614c3dafecad4f32d97ed2 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Fri, 22 Feb 2013 13:18:19 -0500 Subject: Slight code cleanup effort. Beginnings of system stat output --- benchy.py | 210 +++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 140 insertions(+), 70 deletions(-) diff --git a/benchy.py b/benchy.py index 84a9b5d..f501dea 100755 --- a/benchy.py +++ b/benchy.py @@ -1,18 +1,34 @@ #!/usr/bin/env python import os import sys +import tarfile import time import string import StringIO import tempfile import numpy import argparse +import psutil from matplotlib import pyplot +class System_Info: + def dump(self, path): + print('### Cpu ###') + cpu_times = psutil.cpu_times(percpu=True) + cpu_percent = psutil.cpu_percent(percpu=True) + print('## Times ##') + for k in cpu_times: + print(k) + print('## Percent ##') + for k in cpu_percent: + print(k) + print('### Memory ###') + mem = psutil.virtual_memory() + print(mem) + class Statistics: def __init__(self): self.results = {} - pass def store(self, key, value): try: @@ -20,17 +36,17 @@ class Statistics: except: return False return True - + def append(self, key, value): try: self.results[key].append(value) except: return False return True - - def retrieve(self): - return self.results[self.name] - + + def retrieve(self, key): + return self.results[key] + def get_numpy(self, key): data = self.results[key] xlist = [] @@ -42,42 +58,64 @@ class Statistics: y = numpy.array(ylist) return x, y + def write_1d(self, filename, data): + ''' + filename: file name + data: tuple of values + ''' + try: + output = numpy.column_stack((data)) + numpy.savetxt(filename, output, delimiter=' ') + except IOError as e: + print("%s: %s" % (filename, e.strerror)) + return False + return True + def plot(self): pass - + class Stopwatch: def __init__(self): self.start_time = 0.0 self.stop_time = 0.0 - + def start(self): self.start_time = time.time() def stop(self): self.stop_time = time.time() - + def now(self): return (time.time() - self.start_time) - + def result(self): return (self.stop_time - self.start_time) - + def reset(self): self.start_time = 0.0 - self.stop_time = 0.0 + self.stop_time = 0.0 class Test_Controller: def __init__(self): print("Initializing %s" % (self.__class__)) self.timer = Stopwatch() - self.prefix='benchy_' + self.prefix = 'benchy_' + self.path_static = os.path.join(os.curdir, 'static') self.path_tests = os.path.join(os.curdir, 'tests') self.path_results = os.path.join(os.curdir, 'results') + self.path_results_figures = os.path.join(self.path_results, 'figures') + self.path_results_data = os.path.join(self.path_results, 'data') + if not os.path.exists(self.path_static): + os.mkdir(self.path_static) if not os.path.exists(self.path_tests): os.mkdir(self.path_tests) if not os.path.exists(self.path_results): os.mkdir(self.path_results) - + if not os.path.exists(self.path_results_figures): + os.mkdir(self.path_results_figures) + if not os.path.exists(self.path_results_data): + os.mkdir(self.path_results_data) + class Tar_test(Test_Controller, Statistics): def __init__(self, size=1): @@ -85,11 +123,33 @@ class Tar_test(Test_Controller, Statistics): Statistics.__init__(self) Statistics.store(self, 'write_archive', []) Statistics.store(self, 'read_archive', []) + self.tarfile = os.path.join(self.path_static, 'test.tar') self.MEGABYTE = 1024000 self.size = size - + + def write_archive(self): + #tar = tarfile.open(os.path.join(self.path_results_static, '') + pass - + + def read_archive(self): + self.timer.start() + tar = tarfile.open(self.tarfile, 'r') + for _ in tar: + continue + self.timer.stop() + list_time = self.timer.result() + + self.timer.start() + seek_time = self.timer.result() + print("Path: %s\nEncoding: %s\nFiles listed in %0.2fs" % (tar.name, tar.encoding, list_time)) + + def write_out(self): + pass + + def read_in(self): + pass + class Sequencial_test(Test_Controller, Statistics): def __init__(self, size=1): ''' @@ -107,103 +167,102 @@ class Sequencial_test(Test_Controller, Statistics): Statistics.store(self, 'read_buffered_sync', []) Statistics.store(self, 'read_buffered_async', []) Statistics.store(self, 'read_unbuffered_sync', []) - Statistics.store(self, 'read_unbuffered_async', []) + Statistics.store(self, 'read_unbuffered_async', []) self.MEGABYTE = 1024000 self.size = size self.random_source = os.urandom(self.MEGABYTE * 10) - + def __del__(self): if os.path.exists(self.filename): os.remove(os.path.join(self.filename)) - + def _cleanup(self): self.__del__() - + def stress_test_wrapper(self, iter_max=1): self.stress_buffered_sync(iter_max) self.stress_buffered_async(iter_max) self.stress_unbuffered_sync(iter_max) self.stress_unbuffered_async(iter_max) - + def stress_buffered_sync(self, iter_max=1): print("Synchronous buffered I/O") for i in range(iter_max): - print("Test: %d of %d" % (i+1, iter_max)) + print("Test: %d of %d" % (i + 1, iter_max)) self.write_buffered_sync() self.read_buffered_sync() self._cleanup() - + def stress_buffered_async(self, iter_max=1): print("Asynchronous buffered I/O") for i in range(iter_max): - print("Test: %d of %d" % (i+1, iter_max)) + print("Test: %d of %d" % (i + 1, iter_max)) self.write_buffered_async() self.read_buffered_async() self._cleanup() - + def stress_unbuffered_sync(self, iter_max=1): print("Synchronous unbuffered I/O") for i in range(iter_max): - print("Test: %d of %d" % (i+1, iter_max)) - sys.stdout.flush() + print("Test: %d of %d" % (i + 1, iter_max)) self.write_unbuffered_sync() self.read_unbuffered_sync() self._cleanup() - + def stress_unbuffered_async(self, iter_max=1): print("Asynchronous unbuffered I/O") for i in range(iter_max): - print("Test: %d of %d" % (i+1, iter_max)) + print("Test: %d of %d" % (i + 1, iter_max)) self.write_unbuffered_async() self.read_unbuffered_async() self._cleanup() - + def write_buffered_sync(self): - Statistics.append(self,'write_buffered_sync', self.write_out(size=self.size)) - + Statistics.append(self, 'write_buffered_sync', self.write_out(size=self.size)) + def write_buffered_async(self): Statistics.append(self, 'write_buffered_async', self.write_out(size=self.size, async=True)) - + def write_buffered_stepping(self): pass - + def write_unbuffered_sync(self): Statistics.append(self, 'write_unbuffered_sync', self.write_out(size=self.size, mode='unbuffered')) - + def write_unbuffered_async(self): Statistics.append(self, 'write_unbuffered_async', self.write_out(size=self.size, mode='unbuffered', async=True)) - + def write_unbuffered_stepping(self): pass def read_buffered_sync(self): - Statistics.append(self,'read_buffered_sync', self.read_in(size=self.size)) - + Statistics.append(self, 'read_buffered_sync', self.read_in(size=self.size)) + def read_buffered_async(self): Statistics.append(self, 'read_buffered_async', self.read_in(size=self.size, async=True)) - + def read_buffered_stepping(self): pass - + def read_unbuffered_sync(self): Statistics.append(self, 'read_unbuffered_sync', self.read_in(size=self.size, mode='unbuffered')) - + def read_unbuffered_async(self): Statistics.append(self, 'read_unbuffered_async', self.read_in(size=self.size, mode='unbuffered', async=True)) - + def read_unbuffered_stepping(self): pass - + def write_out(self, size, bufsiz=1024000, mode='buffered', async=False): size = size * self.MEGABYTE temp = tempfile.NamedTemporaryFile(dir=self.path_tests, prefix=self.prefix, delete=False) - self.filename = temp.name + self.filename = temp.name outfile = file(self.filename, 'wb') total_bytes = 0 - + self.timer.start() while total_bytes <= size: - try: + try: source = StringIO.StringIO(self.random_source) if mode == 'buffered': buf = source.read(bufsiz) @@ -224,15 +283,15 @@ class Sequencial_test(Test_Controller, Statistics): rate = (total_bytes / self.timer.result() / 1024 / 1024) elapsed = self.timer.result() return rate, elapsed - + def read_in(self, size, bufsiz=1024000, mode='buffered', async=False): size = size * self.MEGABYTE infile = file(self.filename, 'rb') total_bytes = 0 - + self.timer.start() while total_bytes <= size: - try: + try: if mode == 'buffered': buf = infile.read(bufsiz) else: @@ -254,47 +313,58 @@ class Sequencial_test(Test_Controller, Statistics): if __name__ == "__main__": parser = argparse.ArgumentParser(description='Benchy the Benchmarker') parser.add_argument('-p', '--passes', default=10, action='store', type=int, required=False) - parser.add_argument('-s', '--steps', default=[1], action='append', type=int, required=False) + parser.add_argument('-s', '--size-step', default=[1], action='store', type=int, required=False) args = vars(parser.parse_args()) - - for size in args['steps']: + + sysinfo = System_Info() + sysinfo.dump(os.curdir) + for size in args['size_step']: print("### %dMB ####" % (size)) sequence_test = Sequencial_test(size) sequence_test.stress_buffered_sync(args['passes']) sequence_test.stress_buffered_async(args['passes']) sequence_test.stress_unbuffered_sync(args['passes']) - sequence_test.stress_unbuffered_async(args['passes']) - + sequence_test.stress_unbuffered_async(args['passes']) + for k in sequence_test.results: print('%s' % (k)) rate, elapsed = sequence_test.get_numpy(k) rate_mean = numpy.repeat(numpy.mean(rate), rate.size, 0) - #rate_average = numpy.repeat(numpy.average(rate), rate.size, 0) elapsed_mean = numpy.repeat(numpy.mean(elapsed), elapsed.size, 0) - #elapsed_average = numpy.repeat(numpy.average(elapsed), elapsed.size, 0) print("\tRate mean: %0.4f" % (numpy.mean(rate_mean))) print("\tElapsed mean: %0.4f" % (numpy.mean(elapsed_mean))) - + pyplot.figure(1) pyplot.subplot(211) pyplot.title(k) pyplot.grid(True) - pyplot.xlabel('Iteration') + pyplot.xlabel('Iteration') pyplot.ylabel('Rate (MB/s)') - pyplot.plot(rate, label='Rate') - #pyplot.plot(rate_average) - pyplot.plot(rate_mean, label='Mean') - pyplot.legend(('Rate', 'Mean')) - + + pyplot.plot(rate) + pyplot.plot(rate_mean) + pyplot.subplot(212) pyplot.grid(True) pyplot.xlabel('Iteration') pyplot.ylabel('Time to Write') - pyplot.plot(elapsed, label='Elapsed') - #pyplot.plot(elapsed_average) - pyplot.plot(elapsed_mean, label='Mean') - pyplot.legend(('Elapsed', 'Mean')) - - pyplot.savefig(os.path.join(sequence_test.path_results, string.join([k, str(sequence_test.size)], sep='_'))) + + pyplot.plot(elapsed) + pyplot.plot(elapsed_mean) + + pyplot.savefig(\ + os.path.join(sequence_test.path_results_figures, \ + string.join([k, str(sequence_test.size)], sep='_'))) + sequence_test.write_1d(\ + os.path.join(sequence_test.path_results_data, \ + string.join([k, str(sequence_test.size)], sep='_')), \ + (rate, elapsed)) + sequence_test.write_1d(\ + os.path.join(sequence_test.path_results_data, \ + string.join([k, 'mean', str(sequence_test.size)], sep='_')), \ + (rate_mean, elapsed_mean)) pyplot.close() - \ No newline at end of file + ''' + tar_test = Tar_test() + tar_test.read_archive() + ''' -- cgit