summaryrefslogtreecommitdiff
path: root/codec-speed
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-04-23 17:51:41 +0100
committerLars Wirzenius <liw@liw.fi>2011-04-23 17:51:41 +0100
commit03323cc03e6dfdbc9c30ab6acde255bd4f82f495 (patch)
treeda7544789800cd09f76a9de8ae1085917340fa6f /codec-speed
parentceec0979e45cd07f9ae95452457e83cec503fe69 (diff)
downloadlarch-03323cc03e6dfdbc9c30ab6acde255bd4f82f495.tar.gz
Refactor to use cliapp.
This makes it easier to have options.
Diffstat (limited to 'codec-speed')
-rwxr-xr-xcodec-speed139
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()