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 "Folding steps": []
50 }
51
52 span_name = span.get("name")
53 if span_name == "Folding step":
54 scenarios[scenario_name]["Folding steps"].append(time_seconds)
55 else:
56 scenarios[scenario_name][span_name] = time_seconds
57
58
59def process_logs(file_path):
60 with open(file_path, 'r') as f:
61 for line in f:
62 process_logline(json.loads(line))
63
64
65def print_results():
66 for log in free_logs:
67 print(log)
68 print()
69
70 for scenario_name, data in scenarios.items():
71 print("-" * 80)
72 print(f"Scenario: {scenario_name}")
73 print(report(" Prepare folding", data["Prepare folding"]))
74 print(report(" Transform input", data["Transform input"]))
75 print(report(" Folding verification", data["Folding verification"]))
76
77 folding_steps = data["Folding steps"]
78 print(f" Folding Steps:")
79 print(report(" Average", sum(folding_steps) / len(folding_steps)))
80 print(report(" Min", min(folding_steps)))
81 print(report(" Max", max(folding_steps)))
82
83
84process_logs('out.log')
85print_results()