static PRUint64 ClockResolutionNs() { // NB: why not rely on clock_getres()? Two reasons: (i) it might // lie, and (ii) it might return an "ideal" resolution that while // theoretically true, could never be measured in practice. Since // clock_gettime() likely involves a system call on your platform, // the "actual" timing resolution shouldn't be lower than syscall // overhead. PRUint64 start = ClockTimeNs(); PRUint64 end = ClockTimeNs(); PRUint64 minres = (end - start); // 10 total trials is arbitrary: what we're trying to avoid by // looping is getting unlucky and being interrupted by a context // switch or signal, or being bitten by paging/cache effects for (int i = 0; i < 9; ++i) { start = ClockTimeNs(); end = ClockTimeNs(); PRUint64 candidate = (start - end); if (candidate < minres) minres = candidate; } if (0 == minres) { // measurable resolution is either incredibly low, ~1ns, or very // high. fall back on clock_getres() struct timespec ts; if (0 == clock_getres(CLOCK_MONOTONIC, &ts)) { minres = TimespecToNs(ts); } } if (0 == minres) { // clock_getres probably failed. fall back on NSPR's resolution // assumption minres = 1 * kNsPerMs; } return minres; }
TimeStamp TimeStamp::Now(bool aHighResolution) { return TimeStamp(ClockTimeNs()); }
TimeStamp TimeStamp::Now() { return TimeStamp(ClockTimeNs()); }
void TimeStamp::RecordProcessRestart() { PR_SetEnv(PR_smprintf("MOZ_APP_RESTART=%lld", ClockTimeNs())); sProcessCreation = TimeStamp(); }