轉自http://mp.weixin.qq.com/s/cSZUNMuqk6DL3-nctyxzcw 部分文章。
我們做性能優(yōu)化的時候,經常需要對某個方法執(zhí)行的時間做記錄,就必然會用到上面提到的一些獲取時間的方法。
#define TICK? NSDate *startTime = [NSDate date]
#define TOCK? NSLog(@"Time Cost: %f", -[startTime timeIntervalSinceNow])
客戶端和服務器之間的時間同步
思路:首先還是會依賴于接口和服務器時間做同步,每次同步記錄一個serverTime(Unix time),同時記錄當前客戶端的時間值lastSyncLocalTime,到之后算本地時間的時候先取curLocalTime,算出偏移量,再加上serverTime就得出時間了:
uint64_t realLocalTime = 0;
if (serverTime != 0 && lastSyncLocalTime != 0) {
realLocalTime = serverTime + (curLocalTime - lastSyncLocalTime);
}else {
realLocalTime = [[NSDate date] timeIntervalSince1970]*1000;
}
如果從來沒和服務器時間同步過,就只能取本地的系統(tǒng)時間了,這種情況幾乎也沒什么影響,說明客戶端還沒開始用過。
//get system uptime since last boot
- (NSTimeInterval)uptime
{
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
struct timeval now;
struct timezone tz;
gettimeofday(&now, &tz);
double uptime = -1;
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
{
uptime = now.tv_sec - boottime.tv_sec;
uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
}
return uptime;
}
gettimeofday和sysctl都會受系統(tǒng)時間影響,但他們二者做一個減法所得的值,就和系統(tǒng)時間無關了。這樣就可以避免用戶修改時間了。當然用戶如果關機,過段時間再開機,會導致我們獲取到的時間慢與服務器時間,真實場景中,慢于服務器時間往往影響較小,我們一般擔心的是客戶端時間快于服務器時間。
多和服務器做時間同步,再把關鍵的時間校驗邏輯放在Server端,就不會出現(xiàn)什么意外的bug了。