diff options
author | Lars Wirzenius <liw@liw.fi> | 2011-04-23 17:51:41 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2011-04-23 17:51:41 +0100 |
commit | 03323cc03e6dfdbc9c30ab6acde255bd4f82f495 (patch) | |
tree | da7544789800cd09f76a9de8ae1085917340fa6f /codec-speed | |
parent | ceec0979e45cd07f9ae95452457e83cec503fe69 (diff) | |
download | larch-03323cc03e6dfdbc9c30ab6acde255bd4f82f495.tar.gz |
Refactor to use cliapp.
This makes it easier to have options.
Diffstat (limited to 'codec-speed')
-rwxr-xr-x | codec-speed | 139 |
1 files changed, 78 insertions, 61 deletions
diff --git a/codec-speed b/codec-speed index e383f85..fd70235 100755 --- a/codec-speed +++ b/codec-speed @@ -15,6 +15,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. +import cliapp import cProfile import sys import time @@ -22,73 +23,89 @@ import time import larch -def measure(n, unit_size, func, do_profile, profname): - def helper(): - for i in range(n): - func() - - start_time = time.time() - start = time.clock() - if do_profile: - globaldict = globals().copy() - localdict = locals().copy() - cProfile.runctx('helper()', globaldict, localdict, - '%s.prof' % profname) - else: - helper() - end = time.clock() - end_time = time.time() - - def speed(secs): - MiB = 1024**2 - return float(n * unit_size) / float(secs) / MiB - cpu_speed = speed(end - start) - wall_speed = speed(end_time - start_time) - - fmt = '%12s %6.0f MiB/s (CPU) %6.0f MiBs (wall)' - print fmt % (profname, cpu_speed, wall_speed) - -def main(): - n = int(sys.argv[1]) - do_profile = True if sys.argv[2] == 'yes' else False - - # Prepare data for tests. +class CodecBenchmark(cliapp.Application): - key_size = 19 - value_size = 128 - node_size = 64*1024 + def add_settings(self): + self.settings.add_string_setting(['csv'], + 'append a CSV row to FILE', + metavar='FILE') + self.settings.add_boolean_setting(['profile'], + 'run benchmark under profiling?') + self.settings.add_integer_setting(['keys', 'n'], + 'run benchmark with N keys ' + '(default: %default)', + metavar='N', + default=10000) - codec = larch.NodeCodec(key_size) + def process_args(self, args): + n = self.settings['keys'] + do_profile = self.settings['profile'] - key_fmt = '%%0%dd' % key_size - keys = [key_fmt % i for i in range(n)] - - value_fmt = '%%0%dd' % value_size - leaf_values = [value_fmt % i for i in range(n)] - index_values = range(n) + # Prepare data for tests. - leaf = larch.LeafNode(42, keys, leaf_values) - encoded_leaf = codec.encode_leaf(leaf) + key_size = 19 + value_size = 128 + node_size = 64*1024 - index = larch.IndexNode(42, keys, index_values) - encoded_index = codec.encode_index(index) + codec = larch.NodeCodec(key_size) - # Measure and report. - print 'num_operations: %d' % n - measure(n, len(encoded_leaf), lambda: codec.leaf_size(keys, leaf_values), - do_profile, 'leaf_size') - measure(n, len(encoded_leaf), lambda: codec.encode_leaf(leaf), - do_profile, 'encode_leaf') - measure(n, len(encoded_leaf), lambda: codec.decode(encoded_leaf), - do_profile, 'decode_leaf') - measure(n, len(encoded_index), lambda: codec.encode_index(index), - do_profile, 'encode_index') - measure(n, len(encoded_index), lambda: codec.decode_index(encoded_index), - do_profile, 'decode_index') - - if do_profile: - print 'View *.prof with ./viewprof for profiling results.' + key_fmt = '%%0%dd' % key_size + keys = [key_fmt % i for i in range(n)] + + value_fmt = '%%0%dd' % value_size + leaf_values = [value_fmt % i for i in range(n)] + index_values = range(n) + + leaf = larch.LeafNode(42, keys, leaf_values) + encoded_leaf = codec.encode_leaf(leaf) + + index = larch.IndexNode(42, keys, index_values) + encoded_index = codec.encode_index(index) + + # Measure and report. + print 'num_operations: %d' % n + self.measure(n, len(encoded_leaf), + lambda: codec.leaf_size(keys, leaf_values), + do_profile, 'leaf_size') + self.measure(n, len(encoded_leaf), lambda: codec.encode_leaf(leaf), + do_profile, 'encode_leaf') + self.measure(n, len(encoded_leaf), lambda: codec.decode(encoded_leaf), + do_profile, 'decode_leaf') + self.measure(n, len(encoded_index), lambda: codec.encode_index(index), + do_profile, 'encode_index') + self.measure(n, len(encoded_index), + lambda: codec.decode_index(encoded_index), + do_profile, 'decode_index') + + if do_profile: + print 'View *.prof with ./viewprof for profiling results.' + + def measure(self, n, unit_size, func, do_profile, profname): + def helper(): + for i in range(n): + func() + + start_time = time.time() + start = time.clock() + if do_profile: + globaldict = globals().copy() + localdict = locals().copy() + cProfile.runctx('helper()', globaldict, localdict, + '%s.prof' % profname) + else: + helper() + end = time.clock() + end_time = time.time() + + def speed(secs): + MiB = 1024**2 + return float(n * unit_size) / float(secs) / MiB + cpu_speed = speed(end - start) + wall_speed = speed(end_time - start_time) + + fmt = '%12s %6.0f MiB/s (CPU) %6.0f MiBs (wall)' + print fmt % (profname, cpu_speed, wall_speed) if __name__ == '__main__': - main() + CodecBenchmark().run() |