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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
class AppTestCProfile(object):
spaceconfig = {
"usemodules": ['_lsprof', 'time'],
}
def setup_class(cls):
cls.w_file = cls.space.wrap(__file__)
def test_repr(self):
import _lsprof
assert repr(_lsprof.Profiler) == "<class '_lsprof.Profiler'>"
def test_builtins(self):
import _lsprof
prof = _lsprof.Profiler()
lst = []
prof.enable()
lst.append(len(lst))
prof.disable()
stats = prof.getstats()
expected = (
"<built-in function len>",
"<method 'append' of 'list' objects>",
"<method 'disable' of '_lsprof.Profiler' objects>",
)
for entry in stats:
assert entry.code in expected
def test_builtins_callers(self):
import _lsprof
prof = _lsprof.Profiler(subcalls=True)
lst = []
def f1():
lst.append(len(lst))
prof.enable(subcalls=True)
f1()
prof.disable()
stats = prof.getstats()
expected = (
"<built-in function len>",
"<method 'append' of 'list' objects>",
)
by_id = set()
for entry in stats:
if entry.code == f1.__code__:
assert len(entry.calls) == 2
for subentry in entry.calls:
assert subentry.code in expected
by_id.add(id(subentry.code))
elif entry.code in expected:
by_id.add(id(entry.code))
# :-( cProfile.py relies on the id() of the strings...
assert len(by_id) == len(expected)
def test_direct(self):
import _lsprof
def getticks():
return len(ticks)
prof = _lsprof.Profiler(getticks, 0.25, True, False)
ticks = []
def bar(m):
ticks.append(1)
if m == 1:
foo(42)
ticks.append(1)
def spam(m):
bar(m)
def foo(n):
bar(n)
ticks.append(1)
bar(n+1)
ticks.append(1)
spam(n+2)
prof.enable()
foo(0)
prof.disable()
assert len(ticks) == 16
stats = prof.getstats()
entries = {}
for entry in stats:
assert hasattr(entry.code, 'co_name')
entries[entry.code.co_name] = entry
efoo = entries['foo']
assert efoo.callcount == 2
assert efoo.reccallcount == 1
assert efoo.inlinetime == 1.0
assert efoo.totaltime == 4.0
assert len(efoo.calls) == 2
ebar = entries['bar']
assert ebar.callcount == 6
assert ebar.reccallcount == 3
assert ebar.inlinetime == 3.0
assert ebar.totaltime == 3.5
assert len(ebar.calls) == 1
espam = entries['spam']
assert espam.callcount == 2
assert espam.reccallcount == 0
assert espam.inlinetime == 0.0
assert espam.totaltime == 1.0
assert len(espam.calls) == 1
foo2spam, foo2bar = efoo.calls
if foo2bar.code.co_name == 'spam':
foo2bar, foo2spam = foo2spam, foo2bar
assert foo2bar.code.co_name == 'bar'
assert foo2bar.callcount == 4
assert foo2bar.reccallcount == 2
assert foo2bar.inlinetime == 2.0
assert foo2bar.totaltime == 3.0
assert foo2spam.code.co_name == 'spam'
assert foo2spam.callcount == 2
assert foo2spam.reccallcount == 0
assert foo2spam.inlinetime == 0.0
assert foo2spam.totaltime == 1.0
bar2foo, = ebar.calls
assert bar2foo.code.co_name == 'foo'
assert bar2foo.callcount == 1
assert bar2foo.reccallcount == 0
assert bar2foo.inlinetime == 0.5
assert bar2foo.totaltime == 2.0
spam2bar, = espam.calls
assert spam2bar.code.co_name == 'bar'
assert spam2bar.callcount == 2
assert spam2bar.reccallcount == 0
assert spam2bar.inlinetime == 1.0
assert spam2bar.totaltime == 1.0
def test_scale_of_result(self):
import _lsprof, time
prof = _lsprof.Profiler()
def foo(n):
t = time.time()
while abs(t - time.time()) < 1.0:
pass # busy-wait for 1 second
def bar(n):
foo(n)
prof.enable()
bar(0)
prof.disable()
stats = prof.getstats()
entries = {}
for entry in stats:
entries[entry.code] = entry
efoo = entries[foo.__code__]
ebar = entries[bar.__code__]
assert 0.9 < efoo.totaltime < 2.9
# --- cannot test .inlinetime, because it does not include
# --- the time spent doing the call to time.time()
#assert 0.9 < efoo.inlinetime < 2.9
for subentry in ebar.calls:
assert 0.9 < subentry.totaltime < 2.9
#assert 0.9 < subentry.inlinetime < 2.9
def test_builtin_exception(self):
import math
import _lsprof
prof = _lsprof.Profiler()
prof.enable()
try:
math.sqrt("a")
except TypeError:
pass
prof.disable()
stats = prof.getstats()
assert len(stats) == 2
|