From 8f87419564532b304dec7105afe005f85cdec0e1 Mon Sep 17 00:00:00 2001 From: Christopher Peplin Date: Thu, 22 Aug 2013 10:57:48 -0400 Subject: [PATCH] Benchmark encoding translated messages as binary, too. Results for all of my trace files: > ./compare_sizes.py ~/ownCloud/OpenXC\ Traces/peplin/**/*.json 1 For the 89 trace files given... Total transferred raw JSON size is 13.3MB Total transferred raw binary size is 2.1MB Total transferred translated JSON size is 791.0MB Total transferred translated binary size is 318.6MB Total transferred JSON size is 804.3MB Total transferred binary size is 320.6MB Binary encoding is 84.328494% smaller than JSON for raw messages Binary encoding is 59.727489% smaller than JSON for translated messages Binary encoding is 60.133196% smaller than JSON overall --- benchmark/proto/compare_sizes.py | 56 ++++++++++++++++++++++++++++++++-------- benchmark/proto/openxc.proto | 3 +++ 2 files changed, 48 insertions(+), 11 deletions(-) mode change 100644 => 100755 benchmark/proto/compare_sizes.py diff --git a/benchmark/proto/compare_sizes.py b/benchmark/proto/compare_sizes.py old mode 100644 new mode 100755 index ce6b25b..b8b79bb --- 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 0af663c..0e39bb6 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 -- 2.16.6