result of os.times() is different with 'time' command

Douglas Wells see at signature.invalid
Fri Feb 2 22:27:12 EST 2007


[various posting problems corrected and response interspersed in
previous post for purposes of coherent response]

In article <1170446796.156141.201960 at v33g2000cwv.googlegroups.com>,
"aspineux" <aspineux at gmail.com> writes:
> On 2 Feb, 19:30, kwa... at gmail.com wrote:
> > Hi,
> >
> > I have a question about os.times().
> > os.times() returns a tuple containing user time and system time,
> > but it is not matched to the result of 'time' command.
> > For example, os.times() reports that user time is 39.85 sec,
> > but 'time' command reports that user time is 28.55sec.
> > (machine: Python2.5, MacOS X 10.4 Tiger, MacBook 1.83GHz intel core
> > duo)
> >
> >   [ source elided ]
> 
> I dont see anything wrong !
> Did you try to measure time with your watch ?
> Did you try a simple python test.py without the time command ?
> Maybe python is 'disturbed' by the intel core
> 
> can you try this ?
> 
> # strace python test.py  2>&1 | grep time
> times({tms_utime=1, tms_stime=1, tms_cutime=0, tms_cstime=0}) =
> 430217777
> times({tms_utime=2238, tms_stime=2, tms_cutime=0, tms_cstime=0})  = 430220049
> write(1, "n=35, v=14930352\nutime=22.37, st"..., 41n=35, v=14930 52
> utime=22.37, stime=0.01

Note that this likely won't work.  First, strace is not native to
OS X; ktrace is the analogous native command.  Second, OS X almost
certainly implements the times system call in terms of getrusage.

> >   Result:
> >   ====================
> >   $ python -V
> >   Python 2.5
> >   $ time python ostimetest.py
> >   n=35, v=14930352
> >   utime=39.85, stime=0.216666666667
> >   real    0m28.554suser    0m23.938ssys     0m0.177s
> >   ====================
> >
> > This shows that os.times() reports that user time is 39.85sec,
> > but time command shows that user time is 23.938sec.
> > Why os.times() reports wrong result? Do I have any mistake?
> >
> > --
> > kwatch

Yes, I can reproduce this on my FreeBSD system.  No, I do not believe
that you have made a mistake.  Yes, I believe that you have uncovered
a bug in the Python os/posix modules.

Here's my analysis (although I should note that I've not looked
at the source of Python previously).  I'm looking at Python 2.4.3,
but this looks like a long existing bug:

The following code exists in the source code module
Modules/posixmodule.c @ posix_times:
        struct tms t;
        clock_t c;
        [ ... ]
        c = times(&t);
                [ ... ]
        return Py_BuildValue("ddddd",
                             (double)t.tms_utime / HZ,
                             (double)t.tms_stime / HZ,
                             (double)t.tms_cutime / HZ,
                             (double)t.tms_cstime / HZ,
                             (double)c / HZ);
This is incorrect.  It should not be dividing by HZ, but by the
result of the dynamic value 'sysconf (_SC_CLK_TCK)'.  Even if
it were to use a compile time value, the proper value would be
CLK_TCK, not HZ.

So here's what's happening.  Neither my FreeBSD nor the OP's Mac
defines HZ as a compile time variable, but the same source module
also contains the following code:
        #ifndef HZ
        #define HZ 60 /* Universal constant :-) */
        #endif /* HZ */
So, the Python posix module is using 60 instead of the proper
value, which happens to be 128 on my FreeBSD, and 100 on the OP's
OS X(*).  (BTW, this sort of historic code is exactly why POSIX
no longer defines HZ.)

In support of this, I note that the following ratios exist:
  user time from os.times / user time from time command
                    39.85 / 23.938 => 1.665
                      CLK_TCK / HZ
                          100 / 60 => 1.667
which are in reasonably close agreement!

 - dmw

[*] I've actually only looked at OS X for the PPC platform, not
for the User's Intel platform, but I'm fairly certain that the
CLK_TCK value is the same on both.

-- 
.   Douglas Wells             .  Connection Technologies      .
.   Internet:  -sp9804- -at - contek.com-                     .



More information about the Python-list mailing list