-
chevron_right
Christian Hergert: Improving poll() timeout precision
news.movim.eu / PlanetGnome • 3 March, 2024 • 1 minute
Recently I was looking at a VTE performance issue so I added a bunch of Sysprof timing marks to be picked up by the profiler. I combined that with GTK frame timing information and GNOME Shell timing information because Sysprof will just do that for you. I noticed a curious thing in that almost every
ClutterFrameClock.dispatch()
callback was rougly 1 millisecond late.
A quick look at the source code shows that
ClutterFrameClock
uses
g_source_set_ready_time()
to specify it’s next deadline to awaken. That is in µsec using the synchronized monotonic clock (
CLOCK_MONOTONIC
).
Except, for various reasons, GLib still uses
poll()
internally which only provides 1 millisecond timeout resolution. So whatever µsec deadline was requested by the
ClutterFrameClock
doesn’t really matter if nothing else wakes up around the same time. And since the GLib
GSource
code will always round up (to avoid spinning the CPU) that means a decent amount late.
With the use of
ppoll()
out of question, the next thing to use on Linux would be a
timerfd(2)
.
Here is a patch
to make GLib do that. I don’t know if that is something we should have there as it will create an extra
timerfd
for every
GMainContext
you have, but it doesn’t seem insane to do it there either.
If that isn’t to be, then
here is a patch
to
ClutterFrameClock
which does the same thing there.
And finally, here is a graph of how the jitter looks when not using
timerfd
and when using
timerfd
.