[U-Boot] [PATCH 1/1] test/py/tests/test_sleep.py: test time approximately
Stephen Warren
swarren at wwwdotorg.org
Fri Oct 13 20:12:07 UTC 2017
On 10/05/2017 04:33 PM, Heinrich Schuchardt wrote:
> On 10/05/2017 11:10 PM, Stephen Warren wrote:
>> On 10/05/2017 01:52 PM, Heinrich Schuchardt wrote:
>>> On qemu errors like
>>> assert 2.999650001525879 >= 3
>>> occur.
>>
>> Can you work out why? I guess 1-999650001525879 is a really tiny amount,
>> so perhaps it's OK. However, I'd like to keep the test strict if
>> possible; maybe rather than:
>>
>>> + assert elapsed >= (sleep_time - 0.25)
>>
>> can we use:
>>
>>> + assert elapsed >= (sleep_time - 0.01)
>>
>> ?
>>
>>> According to the comment in the code the test is meant to be
>>> approximate. So we should accept some milliseconds less.
>>
>> This test is deliberately very strict about the minimum time taken
>> during sleep, and slightly sloppy about over-sleeping. That's because
>> sleep should never wait too little time, but we allow a little extra
>> time due to e.g. the test system being a bit busy and not noticing when
>> the sleep wakes up.
>
> You are making unreasonable assumptions about the accuracy of system clocks.
>
> I am not aware of U-Boot making any guarantees that the clock is never
> too fast.
It depends what you mean by "too fast".
The intention of this test was to validate that the clock isn't e.g. 2x
or 10x too fast. I think it's reasonable to assume that U-Boot
guarantees that, even if there's no written statement to that effect.
"Too fast" isn't intended to mean anything like "no more than 0.5% too
fast" for example. The current test does have a bug in that regard.
> If you want sleep to never consume less time than requested you would at
> least always have to add 1 timer tick to the requested time in the sleep
> function.
Yes. I've pointed this out at times when working on delay functions in
the past. Simon Glass said this didn't matter:-(
> The test does not even use a timer function that is meant to measure
> with the accuracy that you expect.
>
> It uses Python function time.time() that is not guaranteed to have a
> resolution better than one second and has no guarantee to be non-decreasing.
In practice, the resolution typically is far better than one second
though. I think that aspect of the test is good enough for now, until
someone needs to run it on some odd host that doesn't have sub-second
resolution.
> The right way to measure time for performance measurements is Python 3.3
> function time.perf_counter().
Unfortunately, that API doesn't seem to be available on Python 2. The
test/py code currently supports Python 2, although recently some patches
were sent to make it work on Python 3 too. Is there an alternative
that's better than time.time() and works on both Python versions?
> QEMU provides no guarantees concerning time synchroniation. So shouldn't
> we be happy with the little randomness that we see in some systems, e.g.
>
> 3.000195026397705
> 3.000035047531128
> 3.000230073928833
> 2.9996659755706787
> 3.0026118755340576
> 3.0025811195373535
> 3.0034120082855225
> 3.002816915512085
> 3.002542018890381
> 3.0020010471343994
Yes, I think that level of randomness would be perfectly acceptable. My
objection is to allowing e.g. the 0.25 second variation that your
proposed patch allows; I believe that's far too high of a variation. The
0.01 variation that I proposed for the low side:
>>> + assert elapsed >= (sleep_time - 0.01)
... would work just fine for all those values (there is only one value
in that list less than 3). The allowed variation on the other side
should be a bit larger (and already is; 0.25 seconds).
More information about the U-Boot
mailing list