Skip to content

Commit a7688cd

Browse files
pablogsallkollar
authored andcommitted
dfsdf
1 parent 965662e commit a7688cd

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

benchmark.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import argparse
2+
import _remote_debugging
3+
import time
4+
5+
def benchmark(unwinder):
6+
all = 0
7+
fail = 0
8+
total_time = 0.0
9+
10+
while True:
11+
all += 1
12+
t0 = time.perf_counter()
13+
n_frames = 1
14+
try:
15+
n_frames = len(unwinder.get_stack_trace()[0][1]) + 1
16+
except (RuntimeError, UnicodeDecodeError) as e:
17+
print(e)
18+
fail += 1
19+
t1 = time.perf_counter()
20+
21+
total_time += (t1 - t0)
22+
success = all - fail
23+
24+
avg_us = (total_time / all) * 1e6 if all else 0.0
25+
# print(f"Average interval: {avg_us:.2f} µs | "
26+
# f"Average interval: {all/total_time:.2f}Hz "
27+
# f"Average interval per frame: {avg_us/n_frames:.2f} µs | "
28+
# f"Success rate: {(success / all) * 100:.2f}%")
29+
30+
31+
def sample(unwinder, interval_us):
32+
interval_sec = interval_us / 1e6
33+
all = 0
34+
fail = 0
35+
slow = 0
36+
37+
while True:
38+
all += 1
39+
t0 = time.perf_counter()
40+
try:
41+
unwinder.get_stack_trace()
42+
except (RuntimeError, UnicodeDecodeError):
43+
fail += 1
44+
t1 = time.perf_counter()
45+
46+
elapsed = t1 - t0
47+
if elapsed > interval_sec:
48+
slow += 1
49+
50+
success = all - fail
51+
print(f"Interval: {interval_us:.2f} µs | "
52+
f"Sample rate: {(elapsed/1e-6):.2f}us | "
53+
f"Success rate: {(success / all) * 100:.2f}% | "
54+
f"Slow samples: {slow}/{all} ({(slow / all) * 100:.2f}%)")
55+
56+
if all > 1000 and (slow / all) > 0.90:
57+
raise RuntimeError("More than 90% of samples exceeded the requested interval")
58+
59+
sleep_time = interval_sec - elapsed
60+
if sleep_time > 0:
61+
time.sleep(sleep_time)
62+
63+
64+
def main():
65+
parser = argparse.ArgumentParser(description="Remote stack sampler")
66+
parser.add_argument("pid", type=int, help="PID of the target process")
67+
group = parser.add_mutually_exclusive_group(required=True)
68+
group.add_argument("--benchmark", action="store_true", help="Run in max-speed benchmark mode")
69+
group.add_argument("--interval", type=float,
70+
help="Sampling interval in microseconds (e.g. 1000 for 1ms)")
71+
72+
args = parser.parse_args()
73+
unwinder = _remote_debugging.RemoteUnwinder(args.pid, all_threads=False)
74+
75+
if args.benchmark:
76+
benchmark(unwinder)
77+
else:
78+
sample(unwinder, args.interval)
79+
80+
81+
if __name__ == "__main__":
82+
main()
83+

0 commit comments

Comments
 (0)