aboutsummaryrefslogtreecommitdiff
blob: aa0f26cf2ccb995d395ad496acd48c87f5bffd8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""Test suite for the profile module."""

import profile
import os
from test.test_support import TESTFN, vereq

# In order to have reproducible time, we simulate a timer in the global
# variable 'ticks', which represents simulated time in milliseconds.
# (We can't use a helper function increment the timer since it would be
# included in the profile and would appear to consume all the time.)
ticks = 0

def test_1():
    global ticks
    ticks = 0
    prof = profile.Profile(timer)
    prof.runctx("testfunc()", globals(), globals())
    prof.print_stats()

def timer():
    return ticks*0.001

def testfunc():
    # 1 call
    # 1000 ticks total: 400 ticks local, 600 ticks in subfunctions
    global ticks
    ticks += 199
    helper()                            # 300
    helper()                            # 300
    ticks += 201

def helper():
    # 2 calls
    # 300 ticks total: 40 ticks local, 260 ticks in subfunctions
    global ticks
    ticks += 1
    helper1()                           # 30
    ticks += 3
    helper1()                           # 30
    ticks += 6
    helper2()                           # 50
    ticks += 5
    helper2()                           # 50
    ticks += 4
    helper2()                           # 50
    ticks += 7
    helper2()                           # 50
    ticks += 14

def helper1():
    # 4 calls
    # 30 ticks total: 29 ticks local, 1 tick in subfunctions
    global ticks
    ticks += 10
    hasattr(C(), "foo")
    ticks += 19

def helper2():
    # 8 calls
    # 50 ticks local: 39 ticks local, 11 ticks in subfunctions
    global ticks
    ticks += 11
    hasattr(C(), "bar")                 # 1
    ticks += 13
    subhelper()                         # 10
    ticks += 15

def subhelper():
    # 8 calls
    # 10 ticks total: 8 ticks local, 2 ticks in subfunctions
    global ticks
    ticks += 2
    for i in range(2):
        try:
            C().foo                     # 1 x 2
        except AttributeError:
            ticks += 3                  # 3 x 2

class C:
    def __getattr__(self, name):
        # 28 calls
        # 1 tick, local
        global ticks
        ticks += 1
        raise AttributeError


def test_2():
    d = globals().copy()
    def testfunc():
        global x
        x = 1
    d['testfunc'] = testfunc
    profile.runctx("testfunc()", d, d, TESTFN)
    vereq (x, 1)
    os.unlink (TESTFN)

def test_3():
    result = []
    def testfunc1():
        try: len(None)
        except: pass
        try: len(None)
        except: pass
        result.append(True)
    def testfunc2():
        testfunc1()
        testfunc1()
    profile.runctx("testfunc2()", locals(), locals(), TESTFN)
    vereq(result, [True, True])
    os.unlink(TESTFN)

def test_main():
    test_1()
    test_2()
    test_3()

if __name__ == "__main__":
    test_main()