Skip to content

Commit e054487

Browse files
authored
Profile (#37)
Switch from sys.settrace to sys.setprofile The profile part has less overhead, as it only gets called for call and return. Moreover, we do not need to care about threads, as Score-P does this for us. In theory, it is also possible to catch calls to builtin C functions. However, this is not implemented. Also added a minimal async example.
1 parent 0041bcf commit e054487

File tree

2 files changed

+49
-19
lines changed

2 files changed

+49
-19
lines changed

scorep/trace.py

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@
77
try:
88
import threading
99
except ImportError:
10-
_settrace = sys.settrace
10+
_settrace = sys.setprofile
1111

1212
def _unsettrace():
13-
sys.settrace(None)
13+
sys.setprofile(None)
1414

1515
else:
1616
def _settrace(func):
17-
threading.settrace(func)
18-
sys.settrace(func)
17+
threading.setprofile(func)
18+
sys.setprofile(func)
1919

2020
def _unsettrace():
21-
sys.settrace(None)
22-
threading.settrace(None)
21+
sys.setprofile(None)
22+
threading.setprofile(None)
2323

2424
global_trace = scorep.trace_dummy.ScorepTraceDummy()
2525

@@ -33,10 +33,8 @@ def __init__(self, scorep_bindings, trace=True):
3333
global global_trace
3434
global_trace = self
3535

36-
self.pathtobasename = {} # for memoizing os.path.basename
3736
self.scorep_bindings = scorep_bindings
3837
self.globaltrace = self.globaltrace_lt
39-
self.localtrace = self.localtrace_trace
4038
self.no_init_trace = not trace
4139

4240
def register(self):
@@ -46,9 +44,6 @@ def unregister(self):
4644
_unsettrace()
4745

4846
def run(self, cmd):
49-
#import __main__
50-
#dict = __main__.__dict__
51-
#self.runctx(cmd, dict, dict)
5247
self.runctx(cmd)
5348

5449
def runctx(self, cmd, globals=None, locals=None):
@@ -93,19 +88,16 @@ def globaltrace_lt(self, frame, why, arg):
9388
if not code.co_name == "_unsettrace" and not modulename == "scorep.trace":
9489
self.scorep_bindings.region_begin(
9590
modulename, code.co_name, full_file_name, line_number)
96-
return self.localtrace
97-
else:
98-
return None
99-
100-
def localtrace_trace(self, frame, why, arg):
101-
if why == "return":
91+
return
92+
elif why == 'return':
10293
code = frame.f_code
10394
modulename = frame.f_globals.get('__name__', None)
10495
if modulename is None:
10596
modulename = "None"
10697
self.scorep_bindings.region_end(modulename, code.co_name)
107-
return self.localtrace
108-
98+
else:
99+
return
100+
109101
def user_region_begin(self, name, file_name=None, line_number=None):
110102
"""
111103
Begin of an User region. If file_name or line_number is None, both will

test/miniasync.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python3
2+
3+
import asyncio
4+
5+
work_size = 10000000
6+
7+
8+
def actual_work(i):
9+
return sum(range(i))
10+
11+
12+
async def work1():
13+
for i in range(5):
14+
print("work1 ", actual_work(i * work_size))
15+
await asyncio.sleep(1)
16+
17+
18+
async def work2():
19+
for i in range(5):
20+
print("work2 ", actual_work(i * work_size))
21+
await asyncio.sleep(1)
22+
23+
24+
async def amain():
25+
await asyncio.gather(
26+
work1(),
27+
work2(),
28+
asyncio.get_event_loop().getaddrinfo("tu-dresden.de", 80),
29+
asyncio.get_event_loop().getaddrinfo("www.tu-dresden.de", 80),
30+
)
31+
32+
33+
def main():
34+
asyncio.run(amain())
35+
36+
37+
if __name__ == "__main__":
38+
main()

0 commit comments

Comments
 (0)