Add 'CAN-binder/libs/openxc-message-format/' from commit 'd9f54f97578429773421abce98d...
[apps/agl-service-can-low-level.git] / CAN-binder / libs / openxc-message-format / benchmark / proto / compare_sizes.py
1 #!/usr/bin/env python
2
3 from __future__ import division
4 import sys
5 import numbers
6
7 import openxc_pb2
8 import json
9
10 def sizeof_fmt(num):
11     for unit in ['bytes', 'KB', 'MB', 'GB', 'TB']:
12         if num < 1024.0:
13             return "%3.1f%s" % (num, unit)
14         num /= 1024.0
15
16 total_raw_can_size = 0
17 total_raw_json_size = 0
18 total_raw_binary_size = 0
19 total_translated_json_size = 0
20 total_translated_binary_size = 0
21
22 for trace_file in sys.argv[1:]:
23     for line in open(trace_file):
24         try:
25             json_message = json.loads(line)
26         except ValueError:
27             continue
28
29         del json_message['timestamp']
30
31         message = openxc_pb2.VehicleMessage()
32
33         if 'id' and 'data' in json_message:
34             # rough approx. that CAN messages are 10 bytes - they could be less
35             # but most of ours are full 64+11 bits
36             total_raw_can_size += 10
37             total_raw_json_size += len(json.dumps(json_message))
38             message.type = openxc_pb2.VehicleMessage.RAW
39             message.raw_message.message_id = json_message['id']
40             message.raw_message.data = int(json_message['data'], 0)
41             total_raw_binary_size += len(message.SerializeToString())
42         else:
43             message.type = openxc_pb2.VehicleMessage.TRANSLATED
44             message.translated_message.name = json_message['name']
45             if 'event' in json_message:
46                 message.translated_message.string_value = json_message['value']
47                 if isinstance(json_message['event'], bool):
48                     message.translated_message.type = openxc_pb2.TranslatedMessage.EVENTED_BOOL
49                     message.translated_message.boolean_event = json_message['event']
50                 elif isinstance(json_message['event'], numbers.Number):
51                     message.translated_message.type = openxc_pb2.TranslatedMessage.EVENTED_NUM
52                     message.translated_message.numeric_value = json_message['event']
53                 else:
54                     message.translated_message.type = openxc_pb2.TranslatedMessage.EVENTED_STRING
55                     message.translated_message.string_value = json_message['event']
56             else:
57                 if isinstance(json_message['value'], bool):
58                     message.translated_message.type = openxc_pb2.TranslatedMessage.BOOL
59                     message.translated_message.boolean_value = json_message['value']
60                 elif isinstance(json_message['value'], numbers.Number):
61                     message.translated_message.type = openxc_pb2.TranslatedMessage.NUM
62                     message.translated_message.numeric_value = json_message['value']
63                 else:
64                     message.translated_message.type = openxc_pb2.TranslatedMessage.STRING
65                     message.translated_message.string_value = json_message['value']
66             total_translated_json_size += len(json.dumps(json_message))
67             total_translated_binary_size += len(message.SerializeToString())
68
69
70 print("For the %d trace files given..." % len(sys.argv[1:]))
71 print("Total transferred raw CAN size is %s" % sizeof_fmt(total_raw_can_size))
72 print("Total transferred raw JSON size is %s" % sizeof_fmt(total_raw_json_size))
73 print("Total transferred raw binary size is %s" % sizeof_fmt(total_raw_binary_size))
74 print("Total transferred translated JSON size is %s" %
75         sizeof_fmt(total_translated_json_size))
76 print("Total transferred translated binary size is %s" %
77         sizeof_fmt(total_translated_binary_size))
78
79 total_json_size = total_raw_json_size + total_translated_json_size
80 print("Total transferred JSON size is %s" % sizeof_fmt(total_json_size))
81 total_binary_size = total_raw_binary_size + total_translated_binary_size
82 print("Total transferred binary size is %s" % sizeof_fmt(total_binary_size))
83
84 if total_raw_can_size > 0:
85     print("Binary encoding adds %f%% overhead to raw CAN messages" % (
86             total_raw_binary_size / total_raw_can_size * 100 - 100))
87     print("JSON encoding adds %f%% overhead to raw CAN messages" % (
88             total_raw_json_size / total_raw_can_size * 100 - 100))
89 if total_raw_json_size > 0:
90     print("Binary encoding is %f%% smaller than JSON for raw messages" % (
91             100 - (total_raw_binary_size / total_raw_json_size * 100)))
92 if total_translated_json_size > 0:
93     print("Binary encoding is %f%% smaller than JSON for translated messages" % (
94             100 - (total_translated_binary_size / total_translated_json_size * 100)))
95 print("Binary encoding is %f%% smaller than JSON overall" % (
96         100 - (total_binary_size / total_json_size * 100)))