import re
import numpy as np
def parse_trace_file(file_path):
with open(file_path, 'r') as file:
lines = file.readlines()
pattern = re.compile(r"(\d+\.\d+): tracing_mark_write: C\|\d+\|SurfaceTexture.*\|1")
timestamps = []
for line in lines:
match = pattern.search(line)
if match:
timestamp = float(match.group(1))
timestamps.append(timestamp)
return timestamps
def calculate_fps_statistics(timestamps):
if len(timestamps) < 2:
return None
start_time = timestamps[0] + 1
filtered_timestamps = [t for t in timestamps if t >= start_time]
print('filtered_timestamps')
print(filtered_timestamps)
if len(filtered_timestamps) < 2:
return None
intervals = np.diff(filtered_timestamps)
print(intervals)
intervals_X_1000_list = np.round(intervals * 1000, 2)
avg_fps_list_result = []
temp_sum = 0
temp_values = []
for value in intervals:
temp_sum += value
temp_values.append(value)
if temp_sum > 1:
avg = float(1/np.mean(temp_values[:-1]) )
avg_fps_list_result.append(avg)
temp_sum = temp_values[-1]
temp_values = [temp_values[-1]]
if temp_values:
avg = float(1/np.mean(temp_values))
avg_fps_list_result.append(avg)
print(avg_fps_list_result)
# print(intervals_X_1000_list )
average_fps = round(np.mean(avg_fps_list_result), 2)
min_fps = round(np.min(avg_fps_list_result), 2)
fps_variance = round(np.var(intervals_X_1000_list), 2)
max_frame_interval = int(np.max(intervals_X_1000_list)+0.5)
return average_fps, min_fps, fps_variance, max_frame_interval
def main():
file_path = 'D://DemoTest//trace.systrace'
timestamps = parse_trace_file(file_path)
if timestamps:
statistics = calculate_fps_statistics(timestamps)
if statistics:
average_fps, min_fps, fps_variance, max_frame_interval = statistics
print(f"Average FPS: {average_fps}")
print(f"Minimum FPS: {min_fps}")
print(f"FPS Variance: {fps_variance}")
print(f"Maximum frame interval: {max_frame_interval}")
else:
print("Not enough data after filtering out the first 5 seconds.")
else:
print("No valid SurfaceTexture lines found in the trace file.")
if __name__ == "__main__":
main()