submaster: improve avg frequency calculation for efficiency #33516
+17
−4
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The average frequency calculation is currently the most time-consuming function in SubMaster. The previous implementation kept 10 * freq items in a deque and summed all items each time to check the average frequency. For example, with a 100 Hz service frequency, the queue length would be 1000 items, requiring a sum of all 1000 items for each check. Additionally, checking recent dts involved creating and summing a new list from recv_dts, further increasing inefficiency.
For example, in
selfdrived
, the average frequency calculation withinsm.update()
accounted for nearly 30% of theupdate_event()
function’s execution time:This PR introduces a separate deque for recent dts values to avoid redundant list copying. It also improves the efficiency of dts sum calculation in
record_recv_time
(), eliminating the need for costly sum() operations.As a result, the average frequency calculation time in
sm.update()
decreased from 0.660s to 0.151s, reducing its impact onselfdrived