Details
-
Bug
-
Resolution: Unresolved
-
P3: Somewhat important
-
None
-
5.15.0
-
None
-
Mac OS X 10.15.5 with Qt 5.15.0
Description
The attached test program mac-sleep.cpp uses QTest::qSleep to sleep for 50ms 25 times and prints how much time actually elapsed. When run on Linux (tested with Ubuntu 18.04.5 / Qt 5.15.0 and with Ubuntu 20.04 / Qt 5.12.8), it does consistently print 50 (except potentially for the very first invocation, where some initialization may be going on?).
When run on Mac OS X (10.15.5 / Qt 5.15.0 on Github Actions, as I don't own a Mac), I get very erratic results, such as
51 118 94 56 51 106 71 56 101 114 50 106 80 109 75 65 70 57 52 52 54 147 71 51 50
I do realize that qSleep only guarantees that at least the specified amount (here: 50ms) have passed, but sometimes being off by over 100% (or 50ms) seems awfully much. In real life, this wreaks havoc when trying to unit-test timing-based code (such as animations) that can easily have a time-resolution < 0.1 s.
From https://dshil.github.io/blog/missed-os-x-clock-guide/,] , it would seem that there are Mac-specific high-resolution timers and that POSIX (as I understand it, qSleep uses nanosleep) is just some kind of "add on" relying on message-based communication with the kernel. So maybe this issue could be resolved by using the Mac's high-resolution timers directly? (FWIW, it seems that using std::this_thread::sleep_for() is similarly unreliable)
As I stated above, I don't own a Mac, so unfortunately I can't reliably test how this is affected by system configuration, system load, etc.