Hey,

On 12/9/19 10:32 PM, Oleg Hahm wrote:
> Hm, to be honest, I'm not so sure of what kind of efficiency we're speaking
> here. CPU time or memory? Probably both, right? Regarding the CPU efficiency,
> I would assume that this also dictates the maximum precision, right?

I don't think so. The hardware dictates the maximum precision.

I wrote a test (its in tests/ztimer_overhead in the ztimer PR), that
sets a timer, which in its callback gets the current time, and then
calculates the differenve.

Uncorrected (with XTIMER_OVERHEAD=0 or the ztimer equivalent), both add
a pretty constant ~7us, on an nrf52dk using a periph timer clocked at
1MHz. There's not much happening in this simplest case. I don't think we
can carve off much in any high level timer implementation, compared to
using periph_timer or even skipping that and using plain register writes.

Callback based (high-level) timers are only suitable for timeouts down
to a certain level (somewhere below 10us on our hardware scope). Below
that, context switching takes the bulk of the time, so spinning (not
using a callback) is probably preferable.
I mean, if a device can do 100k context switches per second, each takes
10us. Setting a timer to anything below that might work, but doesn't
make much sense.

Even ztimer using only 32bit arithmetic vs. xtimer sometimes needing
64bit comparisons might show measurable differences when there are many
timers active, but I honestly don't know if this difference can become a
deal breaker, or even just relevant.

Cycle wise, xtimer is not terrible to begin with.

That said, if we get an alternative that matches or improves on most
metrics and is still more flexible, and allows proper sleeping, then I
take any percent improvement with a happy face.

> Regarding
> memory we have probably different requirements: ROM for the whole thing, RAM
> per instance and for the module itself.
> 

Here, the requirement should be "needs to fulfill all other
requirements", and from that point on, less is better.
xtimer and ztimer are comparable in ROM and RAM usage. Again, I don't
think that any high level timer implementation can bring disruptive
reduction here.

I'm not looking forward to coming up with requirements for accuracy.
Simple tests (like the overhead test from above) are easy to optimize so
a timer hits bang on the target time, by subtracting a measured overhead
from any interval. Figuring out the impact of having N timers in the
list is difficult, and more difficult to correct.

Here we could come up with a test setting as many timers as fit in RAM
to random values, then measuring each timer's punctuality. All making
sure that the target times don't overlap.

But all the requirements don't help over the fact that xtimer currently
just doesn't work for many identified use cases. Fixing that would
require substantial code changes, probably including API changes.
Knowning the complexity of xtimer, I decided to give a rewrite from
scratch a try, and IMO, the result is quite nice.

I'd maybe roll up the discussion from a different side: If noone can
identify a conceptual flaw, something where a different implementation
or design might yield benefits compared to ztimer, and if ztimer does
not show regressions compared to xtimer, but improves on some relevant
aspects, why don't we consider going with better in the short term and
pursue provably best as a longer term goal?

>>> Besides I'm missing a requirement regarding the maximum granularity and the
>>> maximum duration of a timer.
>>
>> You mean minimum granularity?
> 
> In my understanding of the term maximum granularity translates to the finest
> granularity.

Yup, got it.

Kaspar
_______________________________________________
devel mailing list
devel@riot-os.org
https://lists.riot-os.org/mailman/listinfo/devel

Reply via email to