I see there is a old thread on this topic, check if this topic can be carried on.
#362
Is there any new solution to speed up decoding and encoding timing?
Online receving Messages by python-can and decoding: canmatrix v.s cantools
Example Test Code
def on_message_received(msg):
start = time.perf_counter_ns()
dbc_msg = _database.frame_by_id(msg.arbitration_id)
# start = time.perf_counter_ns()
decoded = dbc_msg.decode(msg.data)
end = time.perf_counter_ns()
timings.append(end-start)
canmatrix
decode
Mean +- std dev: 49.1 us +- 36.5 us (2207 values)
Mean +- std dev: 97.4 us +- 182.5 us (12201 values)
received_message + decode
Mean +- std dev: 147.1 us +- 157.3 us (12201 values)
cantools
decode
Mean +- std dev: 30.0 us +- 29.9 us (2200 values)
Mean +- std dev: 34.8 us +- 35.9 us (12201 values)
received_message + decode
Mean +- std dev: 64.9 us +- 57.7 us (12201 values)
After looking at cantools solution, after database is parsed, it will generate a _codec info which allowed to more quickly encode/decode a message, and generate two dicts which allow quick search message by name or id.
But canmatrix, everytime when receive a raw message, I need to found it in database by using for test in self.frames:, when call decode() method, it try to upack the data by bytes_to_bitstrings() and bitstring_to_signal_list(), which also using for loop.
I do not if bitsruct may help better, and refer to cantools
I see there is a old thread on this topic, check if this topic can be carried on.
#362
Is there any new solution to speed up decoding and encoding timing?
Online receving Messages by python-can and decoding: canmatrix v.s cantools
Example Test Code
canmatrix
decode
Mean +- std dev: 49.1 us +- 36.5 us (2207 values)
Mean +- std dev: 97.4 us +- 182.5 us (12201 values)
received_message + decode
Mean +- std dev: 147.1 us +- 157.3 us (12201 values)
cantools
decode
Mean +- std dev: 30.0 us +- 29.9 us (2200 values)
Mean +- std dev: 34.8 us +- 35.9 us (12201 values)
received_message + decode
Mean +- std dev: 64.9 us +- 57.7 us (12201 values)
After looking at cantools solution, after database is parsed, it will generate a _codec info which allowed to more quickly encode/decode a message, and generate two dicts which allow quick search message by name or id.
But canmatrix, everytime when receive a raw message, I need to found it in database by using
for test in self.frames:, when call decode() method, it try to upack the data bybytes_to_bitstrings()andbitstring_to_signal_list(), which also using for loop.I do not if bitsruct may help better, and refer to cantools