I completely agree with Wesley's comments except for one thing: the time remaining Posix.Process.sleep is non-zero if and only if the sleep was aborted because a signal arrived. It isn't going to tell you about any unspent time caused by lack of precision. Any way, my vote is: optimal is use nanosleep(). Otherwise, you ust round up before calling sleep().