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
.