3 from __future__ import division
11 for unit in ['bytes', 'KB', 'MB', 'GB', 'TB']:
13 return "%3.1f%s" % (num, unit)
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
22 for trace_file in sys.argv[1:]:
23 for line in open(trace_file):
25 json_message = json.loads(line)
29 del json_message['timestamp']
31 message = openxc_pb2.VehicleMessage()
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())
43 if 'event' in json_message:
44 if isinstance(json_message['event'], bool):
45 message.type = openxc_pb2.VehicleMessage.EVENTED_BOOL
46 message.evented_boolean_message.name = json_message['name']
47 message.evented_boolean_message.value = json_message['value']
48 message.evented_boolean_message.event = json_message['event']
49 elif isinstance(json_message['event'], numbers.Number):
50 message.type = openxc_pb2.VehicleMessage.EVENTED_NUM
51 message.evented_numeric_message.name = json_message['name']
52 message.evented_numeric_message.value = json_message['value']
53 message.evented_numeric_message.event = json_message['event']
55 message.type = openxc_pb2.VehicleMessage.EVENTED_STRING
56 message.evented_string_message.name = json_message['name']
57 message.evented_string_message.value = json_message['value']
58 message.evented_numeric_message.event = json_message['event']
60 if isinstance(json_message['value'], bool):
61 message.type = openxc_pb2.VehicleMessage.BOOL
62 message.boolean_message.name = json_message['name']
63 message.boolean_message.value = json_message['value']
64 elif isinstance(json_message['value'], numbers.Number):
65 message.type = openxc_pb2.VehicleMessage.NUM
66 message.numeric_message.name = json_message['name']
67 message.numeric_message.value = json_message['value']
69 message.type = openxc_pb2.VehicleMessage.STRING
70 message.string_message.name = json_message['name']
71 message.string_message.value = json_message['value']
72 total_translated_json_size += len(json.dumps(json_message))
73 total_translated_binary_size += len(message.SerializeToString())
76 print("For the %d trace files given..." % len(sys.argv[1:]))
77 print("Total transferred raw CAN size is %s" % sizeof_fmt(total_raw_can_size))
78 print("Total transferred raw JSON size is %s" % sizeof_fmt(total_raw_json_size))
79 print("Total transferred raw binary size is %s" % sizeof_fmt(total_raw_binary_size))
80 print("Total transferred translated JSON size is %s" %
81 sizeof_fmt(total_translated_json_size))
82 print("Total transferred translated binary size is %s" %
83 sizeof_fmt(total_translated_binary_size))
85 total_json_size = total_raw_json_size + total_translated_json_size
86 print("Total transferred JSON size is %s" % sizeof_fmt(total_json_size))
87 total_binary_size = total_raw_binary_size + total_translated_binary_size
88 print("Total transferred binary size is %s" % sizeof_fmt(total_binary_size))
90 if total_raw_can_size > 0:
91 print("Binary encoding adds %f%% overhead to raw CAN messages" % (
92 total_raw_binary_size / total_raw_can_size * 100 - 100))
93 print("JSON encoding adds %f%% overhead to raw CAN messages" % (
94 total_raw_json_size / total_raw_can_size * 100 - 100))
95 if total_raw_json_size > 0:
96 print("Binary encoding is %f%% smaller than JSON for raw messages" % (
97 100 - (total_raw_binary_size / total_raw_json_size * 100)))
98 if total_translated_json_size > 0:
99 print("Binary encoding is %f%% smaller than JSON for translated messages" % (
100 100 - (total_translated_binary_size / total_translated_json_size * 100)))
101 print("Binary encoding is %f%% smaller than JSON overall" % (
102 100 - (total_binary_size / total_json_size * 100)))