只需使用馬赫時間 。
它是公共API,它可以在macOS,iOS和tvOS上運行,並且可以在沙箱內運行。
馬赫時間返回一個抽象時間單位,我通常稱其爲「時鐘刻度」。時鐘滴答的長度是系統特定的,取決於CPU。在當前的英特爾系統上,時鐘節拍實際上只有一個納秒,但您不能依賴於此(對於ARM可能不同,對於PowerPC CPU它肯定不同)。該系統還可以告訴您轉換因子,將時鐘滴答轉換爲納秒和納秒以作爲時鐘滴答(這個因子是靜態的,在運行時不會改變)。當系統啓動時,時鐘開始於0
,然後隨着每個時鐘週期單調增加,因此您還可以使用Mach Time來獲得系統的正常運行時間(當然,正常運行時間是單調的!)。
下面是一些代碼:
#include <stdio.h>
#include <inttypes.h>
#include <mach/mach_time.h>
int main () {
uint64_t clockTicksSinceSystemBoot = mach_absolute_time();
printf("Clock ticks since system boot: %"PRIu64"\n",
clockTicksSinceSystemBoot
);
static mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
// Cast to double is required to make this a floating point devision,
// otherwise it would be an interger division and only the result would
// be converted to floating point!
double clockTicksToNanosecons = (double)timebase.numer/timebase.denom;
uint64_t systemUptimeNanoseconds = (uint64_t)(
clockTicksToNanosecons * clockTicksSinceSystemBoot
);
uint64_t systemUptimeSeconds = systemUptimeNanoseconds/(1000 * 1000 * 1000);
printf("System uptime: %"PRIu64" seconds\n", systemUptimeSeconds);
}
你也可以把一個線程睡眠狀態,直到一定時間馬赫已經達到。下面是一些代碼:
// Sleep for 750 ns
uint64_t machTimeNow = mach_absolute_time();
uint64_t clockTicksToSleep = (uint64_t)(750/clockTicksToNanosecons);
uint64_t machTimeIn750ns = machTimeNow + clockTicksToSleep;
mach_wait_until(machTimeIn750ns);
馬赫時間沒有聯繫任何時鐘時間,你可以玩你的系統日期和時間設置,只要你喜歡,這不會對馬赫時間任何影響。
雖然有一個特殊的考慮,可能會使馬赫時間不適合某些使用情況:T 當您的系統睡着時CPU時鐘不運行!因此,如果您讓線程等待5分鐘,1分鐘後系統進入睡眠狀態並保持睡眠30分鐘,則線程在系統醒來後仍等待4分鐘,因爲30分鐘的睡眠時間不會計數!在那段時間CPU時鐘也在休息。然而在其他情況下,這正是你想要發生的事情。
馬赫時間也是測量時間的一種非常精確的方法。下面是顯示該任務的一些代碼:再次甚至
// Measure time
uint64_t machTimeBegin = mach_absolute_time();
sleep(1);
uint64_t machTimeEnd = mach_absolute_time();
uint64_t machTimePassed = machTimeEnd - machTimeBegin;
uint64_t timePassedNS = (uint64_t)(
machTimePassed * clockTicksToNanosecons
);
printf("Thread slept for: %"PRIu64" ns\n", timePassedNS);
你會看到該線程不睡了整整一秒,這是因爲它需要一些時間來把一個線程睡眠,喚醒回來當喚醒時,如果當前所有核心已經在忙於運行線程,它將不會立即獲得CPU時間。
據我所知,'CLOCK_MONOTONIC'不保證該值不會漂移,也不存在線程關聯問題。 – zneak 2012-07-27 02:05:56
稍微超過我的腦海,但'mach_absolute_time'確實使用rtdsc,可以從[source](http://www.opensource.apple.com/source/Libc/Libc-320.1.3/i386/mach /mach_absolute_time.c「mach_absolute_time.c」)。 – cobbal 2012-07-27 02:06:54
@cobbal:感謝您的發現!這絕對是爲我規定mach_absolute_time。它可用於快速,短時的測量,因爲該值可能會漂移。 – Brett 2012-07-27 02:11:26