diff options
-rwxr-xr-x[-rw-r--r--] | benchmark/proto/compare_sizes.py | 56 | ||||
-rw-r--r-- | benchmark/proto/openxc.proto | 3 |
2 files changed, 48 insertions, 11 deletions
diff --git a/benchmark/proto/compare_sizes.py b/benchmark/proto/compare_sizes.py index ce6b25b9..b8b79bb9 100644..100755 --- a/benchmark/proto/compare_sizes.py +++ b/benchmark/proto/compare_sizes.py @@ -2,6 +2,7 @@ from __future__ import division import sys +import numbers import openxc_pb2 import json @@ -12,20 +13,53 @@ def sizeof_fmt(num): return "%3.1f%s" % (num, unit) num /= 1024.0 -total_json_size = 0 -total_binary_size = 0 +total_raw_json_size = 0 +total_raw_binary_size = 0 +total_translated_json_size = 0 +total_translated_binary_size = 0 -trace_file = sys.argv[1] -for line in open(trace_file): - raw_message = json.loads(line) - total_json_size += len(json.dumps(raw_message)) - binary_message = openxc_pb2.RawMessage() - binary_message.message_id = raw_message['id'] - binary_message.data = int(raw_message['data'], 0) - total_binary_size += len(binary_message.SerializeToString()) +for trace_file in sys.argv[1:]: + for line in open(trace_file): + try: + json_message = json.loads(line) + except ValueError: + continue -print("For the trace file %s..." % trace_file) + if 'id' and 'data' in json_message: + total_raw_json_size += len(line) + binary_message = openxc_pb2.RawMessage() + binary_message.message_id = json_message['id'] + binary_message.data = int(json_message['data'], 0) + total_raw_binary_size += len(binary_message.SerializeToString()) + else: + if isinstance(json_message['value'], bool): + binary_message = openxc_pb2.TranslatedBooleanMessage() + elif isinstance(json_message['value'], numbers.Number): + binary_message = openxc_pb2.TranslatedNumericMessage() + else: + binary_message = openxc_pb2.TranslatedStringMessage() + binary_message.name = json_message['name'] + binary_message.value = json_message['value'] + total_translated_json_size += len(line) + total_translated_binary_size += len(binary_message.SerializeToString()) + + +print("For the %d trace files given..." % len(sys.argv[1:])) +print("Total transferred raw JSON size is %s" % sizeof_fmt(total_raw_json_size)) +print("Total transferred raw binary size is %s" % sizeof_fmt(total_raw_binary_size)) +print("Total transferred translated JSON size is %s" % + sizeof_fmt(total_translated_json_size)) +print("Total transferred translated binary size is %s" % + sizeof_fmt(total_translated_binary_size)) + +total_json_size = total_raw_json_size + total_translated_json_size print("Total transferred JSON size is %s" % sizeof_fmt(total_json_size)) +total_binary_size = total_raw_binary_size + total_translated_binary_size print("Total transferred binary size is %s" % sizeof_fmt(total_binary_size)) + +print("Binary encoding is %f%% smaller than JSON for raw messages" % ( + 100 - (total_raw_binary_size / total_raw_json_size * 100))) +print("Binary encoding is %f%% smaller than JSON for translated messages" % ( + 100 - (total_translated_binary_size / total_translated_json_size * 100))) print("Binary encoding is %f%% smaller than JSON overall" % ( 100 - (total_binary_size / total_json_size * 100))) diff --git a/benchmark/proto/openxc.proto b/benchmark/proto/openxc.proto index 0af663c8..0e39bb6c 100644 --- a/benchmark/proto/openxc.proto +++ b/benchmark/proto/openxc.proto @@ -19,3 +19,6 @@ message TranslatedBooleanMessage { optional string name = 1; optional bool value = 2; } + +// TODO we should also consider having an enum type, h aving each specific +// message defined as a protobuf |