sonobe-playground/analysis.py
analysis.pyRaw
1import json
2
3
4# Function to convert time units to seconds
5def convert_to_seconds(time_str):
6 if time_str.endswith('µs'):
7 return float(time_str[:-2]) * 1e-6
8 elif time_str.endswith('ms'):
9 return float(time_str[:-2]) * 1e-3
10 elif time_str.endswith('s'):
11 return float(time_str[:-1])
12 return 0
13
14
15def report(operation, time):
16 return f"{operation}: {time:.6f} seconds"
17
18
19scenarios = {}
20free_logs = []
21
22
23def process_logline(log):
24 fields = log.get("fields", {})
25 span = log.get("span", {})
26 scenario_name = None
27 time_seconds = convert_to_seconds(fields["time.busy"])
28
29 # A folding scheme scenario is one of our ancestors
30 for s in log.get("spans", []):
31 if s.get("name") == "scenario":
32 scenario_name = s.get("folding_scheme")
33
34 # Top level span
35 if not scenario_name:
36 folding_scheme = span.get("folding_scheme")
37 if folding_scheme is not None:
38 free_logs.append(report(f"{folding_scheme} total time", time_seconds))
39 else:
40 free_logs.append(report(span["name"], time_seconds))
41 return
42
43 # Within a folding scheme scenario
44 if scenario_name not in scenarios:
45 scenarios[scenario_name] = {
46 "Prepare folding": 0,
47 "Transform input": 0,
48 "Folding verification": 0,
49 "Proving": [],
50 "Input prep": [],
51 }
52
53 span_name = span.get("name")
54 if span_name == "Proving":
55 scenarios[scenario_name]["Proving"].append(time_seconds)
56 elif span_name == "Input prep":
57 scenarios[scenario_name]["Input prep"].append(time_seconds)
58 else:
59 scenarios[scenario_name][span_name] = time_seconds
60
61
62def process_logs(file_path):
63 with open(file_path, 'r') as f:
64 for line in f:
65 process_logline(json.loads(line))
66
67
68def print_results():
69 for log in free_logs:
70 print(log)
71 print()
72
73 for scenario_name, data in scenarios.items():
74 print("-" * 80)
75 print(f"Scenario: {scenario_name}")
76 print(report(" Prepare folding", data["Prepare folding"]))
77 print(report(" Transform input", data["Transform input"]))
78 print(report(" Folding verification", data["Folding verification"]))
79
80 print(f" Folding Steps:")
81 input_trans = data["Input prep"]
82 print(report(" Input prep: Average", sum(input_trans) / len(input_trans)))
83 print(report(" Input prep: Min", min(input_trans)))
84 print(report(" Input prep: Max", max(input_trans)))
85 proving_steps = data["Proving"]
86 print(report(" Proving: Average", sum(proving_steps) / len(proving_steps)))
87 print(report(" Proving: Min", min(proving_steps)))
88 print(report(" Proving: Max", max(proving_steps)))
89
90
91process_logs('out.log')
92print_results()