Hi,
when using the hotshot profiler, I can see no difference in the
measurement of a function that is busy eating CPU cycles, and
a function that is blocking/waiting on IO (or sleeping)...
For instance I have this output:
3 function calls in 26.931 CPU seconds
Ordered by: internal time, call count
ncalls tottime percall cumtime percall filename:lineno(function)
1 13.465 13.465 13.465 13.465 testprof.py:5(cpu)
1 13.464 13.464 13.464 13.464 testprof.py:9(sleep)
1 0.002 0.002 26.931 26.931 testprof.py:12(main)
0 0.000 0.000 profile:0(profiler)
My test program (see below) consists of two functions called sequentially:
a cpu() function eating 13+ seconds of CPU cycles when calculating
sha-hashes, and a sleep() function that only has time.sleep(13) in it.
What would be really useful, is that the profiler would show that sleep()
is actually not doing *anything*, while cpu() is doing all the hard work.
I.E.: measure CPU-time, not user-time.
How do I do this? Is this possible? (I'm using Python 2.3.4)
Thanks!!
--Irmen de Jong.
--------------- test program ------------------
import hotshot, hotshot.stats
import time
import sha
def cpu():
for i in range(1000000):
a=sha.sha("abcdefghijklmnopqrstuvwxyz").hexdigest( )
def sleep():
time.sleep(13)
def main():
print "cpu..."
cpu()
print "sleep..."
sleep()
print "done"
prof = hotshot.Profile("/tmp/test.prof")
result = prof.runcall(main)
prof.close()
print "PROFILE DONE, result=",result,type(result)
stats = hotshot.stats.load("/tmp/test.prof")
stats.strip_dirs()
stats.sort_stats('time', 'calls')
stats.print_stats(20)