tahamajs/CPS / Files /ComputerAssignments /CA2 /trace_analyzer.py
tahamajs's picture
download
raw
1.92 kB
from perfetto.trace_processor import TraceProcessor
def analyze_trace(trace_path):
print(f"Loading trace: {trace_path}")
# Load the trace using the python API
tp = TraceProcessor(trace=trace_path)
print("\n--- Q1 & Q6: Sensor Call Count & Average Duration ---")
q1_it = tp.query('SELECT count(1) as cnt, avg(dur) as avg_dur_ns, max(dur) as max_dur_ns FROM slice WHERE name LIKE "%onSensorChanged%"')
for row in q1_it:
cnt = row.cnt
avg_dur_ms = row.avg_dur_ns / 1e6 if row.avg_dur_ns else 0
max_dur_ms = row.max_dur_ns / 1e6 if row.max_dur_ns else 0
print(f"Total onSensorChanged calls: {cnt}")
print(f"Average Duration: {avg_dur_ms:.4f} ms")
print(f"Max Duration: {max_dur_ms:.4f} ms")
print("\n--- Q3: Actual Sampling Period ---")
q3_it = tp.query('''
SELECT avg(diff) as avg_diff_ns
FROM (
SELECT ts - lag(ts) OVER (ORDER BY ts) as diff
FROM slice
WHERE name LIKE "%onSensorChanged%"
) WHERE diff IS NOT NULL
''')
for row in q3_it:
avg_diff_ms = row.avg_diff_ns / 1e6 if row.avg_diff_ns else 0
print(f"Average time between sensor readings: {avg_diff_ms:.4f} ms")
print("\n--- Q4 & Q10: Thread Statistics for com.airmouse ---")
q4_it = tp.query('''
SELECT thread.name, sum(thread_state.dur) as total_dur_ns, thread_state.state
FROM thread_state
JOIN thread USING(utid)
JOIN process USING(upid)
WHERE process.name = 'com.airmouse'
GROUP BY thread.name, thread_state.state
ORDER BY total_dur_ns DESC
LIMIT 10
''')
for row in q4_it:
dur_ms = row.total_dur_ns / 1e6 if row.total_dur_ns else 0
print(f"Thread: {row.name}, State: {row.state}, Total Time: {dur_ms:.2f} ms")
if __name__ == "__main__":
analyze_trace('trace_file.perfetto-trace')

Xet Storage Details

Size:
1.92 kB
·
Xet hash:
084e0525be7ceb70b4779087aed9bee28538849350ddbcdab1675ae9ddefae5e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.