1 | """
|
---|
2 | Input for test_profile.py and test_cprofile.py.
|
---|
3 |
|
---|
4 | IMPORTANT: This stuff is touchy. If you modify anything above the
|
---|
5 | test class you'll have to regenerate the stats by running the two
|
---|
6 | test files.
|
---|
7 |
|
---|
8 | *ALL* NUMBERS in the expected output are relevant. If you change
|
---|
9 | the formatting of pstats, please don't just regenerate the expected
|
---|
10 | output without checking very carefully that not a single number has
|
---|
11 | changed.
|
---|
12 | """
|
---|
13 |
|
---|
14 | import sys
|
---|
15 |
|
---|
16 | # In order to have reproducible time, we simulate a timer in the global
|
---|
17 | # variable 'TICKS', which represents simulated time in milliseconds.
|
---|
18 | # (We can't use a helper function increment the timer since it would be
|
---|
19 | # included in the profile and would appear to consume all the time.)
|
---|
20 | TICKS = 42000
|
---|
21 |
|
---|
22 | def timer():
|
---|
23 | return TICKS
|
---|
24 |
|
---|
25 | def testfunc():
|
---|
26 | # 1 call
|
---|
27 | # 1000 ticks total: 270 ticks local, 730 ticks in subfunctions
|
---|
28 | global TICKS
|
---|
29 | TICKS += 99
|
---|
30 | helper() # 300
|
---|
31 | helper() # 300
|
---|
32 | TICKS += 171
|
---|
33 | factorial(14) # 130
|
---|
34 |
|
---|
35 | def factorial(n):
|
---|
36 | # 23 calls total
|
---|
37 | # 170 ticks total, 150 ticks local
|
---|
38 | # 3 primitive calls, 130, 20 and 20 ticks total
|
---|
39 | # including 116, 17, 17 ticks local
|
---|
40 | global TICKS
|
---|
41 | if n > 0:
|
---|
42 | TICKS += n
|
---|
43 | return mul(n, factorial(n-1))
|
---|
44 | else:
|
---|
45 | TICKS += 11
|
---|
46 | return 1
|
---|
47 |
|
---|
48 | def mul(a, b):
|
---|
49 | # 20 calls
|
---|
50 | # 1 tick, local
|
---|
51 | global TICKS
|
---|
52 | TICKS += 1
|
---|
53 | return a * b
|
---|
54 |
|
---|
55 | def helper():
|
---|
56 | # 2 calls
|
---|
57 | # 300 ticks total: 20 ticks local, 260 ticks in subfunctions
|
---|
58 | global TICKS
|
---|
59 | TICKS += 1
|
---|
60 | helper1() # 30
|
---|
61 | TICKS += 2
|
---|
62 | helper1() # 30
|
---|
63 | TICKS += 6
|
---|
64 | helper2() # 50
|
---|
65 | TICKS += 3
|
---|
66 | helper2() # 50
|
---|
67 | TICKS += 2
|
---|
68 | helper2() # 50
|
---|
69 | TICKS += 5
|
---|
70 | helper2_indirect() # 70
|
---|
71 | TICKS += 1
|
---|
72 |
|
---|
73 | def helper1():
|
---|
74 | # 4 calls
|
---|
75 | # 30 ticks total: 29 ticks local, 1 tick in subfunctions
|
---|
76 | global TICKS
|
---|
77 | TICKS += 10
|
---|
78 | hasattr(C(), "foo") # 1
|
---|
79 | TICKS += 19
|
---|
80 | lst = []
|
---|
81 | lst.append(42) # 0
|
---|
82 | sys.exc_info() # 0
|
---|
83 |
|
---|
84 | def helper2_indirect():
|
---|
85 | helper2() # 50
|
---|
86 | factorial(3) # 20
|
---|
87 |
|
---|
88 | def helper2():
|
---|
89 | # 8 calls
|
---|
90 | # 50 ticks local: 39 ticks local, 11 ticks in subfunctions
|
---|
91 | global TICKS
|
---|
92 | TICKS += 11
|
---|
93 | hasattr(C(), "bar") # 1
|
---|
94 | TICKS += 13
|
---|
95 | subhelper() # 10
|
---|
96 | TICKS += 15
|
---|
97 |
|
---|
98 | def subhelper():
|
---|
99 | # 8 calls
|
---|
100 | # 10 ticks total: 8 ticks local, 2 ticks in subfunctions
|
---|
101 | global TICKS
|
---|
102 | TICKS += 2
|
---|
103 | for i in range(2): # 0
|
---|
104 | try:
|
---|
105 | C().foo # 1 x 2
|
---|
106 | except AttributeError:
|
---|
107 | TICKS += 3 # 3 x 2
|
---|
108 |
|
---|
109 | class C:
|
---|
110 | def __getattr__(self, name):
|
---|
111 | # 28 calls
|
---|
112 | # 1 tick, local
|
---|
113 | global TICKS
|
---|
114 | TICKS += 1
|
---|
115 | raise AttributeError
|
---|