获得更准确的时间测量

时间:2011-08-25 21:09:24

标签: objective-c time nsdatecomponents

目前,我使用以下方式记录两个事件之间的时间(十进制分钟):

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents =  [calendar components:unitFlags fromDate:date];

CGFloat hour = [dateComponents hour];
CGFloat minute = [dateComponents minute];
CGFloat second = [dateComponents second];

//set start time in decimal minutes
CGFloat startTime = ((hour*3600.0)+(minute*60.0)+(second))*.016666;

//do work...

//set end time in decimal minutes
CGFloat endTime = ((hour*3600.0)+(minute*60.0)+(second))*.016666;

//calculate time elapsed in decimal minutes
CGFloat totalTime = endTime-startTime;

我遇到的问题是我真的只是在几秒钟内获得时间然后转换为小数分钟。所以,我得到的唯一值是0.016663(十进制分钟中的一秒),0.033325(十进制分钟中的两秒),0.049988(十进制分钟中的三秒),我之间没有得到任何价值。有什么方法可以让我得到更准确的时间吗?我检查了NSDateComponents是否有millisecond属性或诸如此类的东西,但我找不到任何属性。

谢谢!

4 个答案:

答案 0 :(得分:6)

您还可以使用CFAbsoluteTimeGetCurrent()返回包含时间的双倍时间,以秒为单位:

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

之后您可以计算以秒为单位的经过时间和几分之一秒:

elapsed = CFAbsoluteTimeGetCurrent() - startTime;

NSLog(@"Elapsed Time: %0.3f seconds", elapsed);

我喜欢在我的app委托中使用调试代码(#ifdef DEBUG),并在我的第一个视图控制器中的viewDidAppear中报告已用的启动时间,以便在开发时能够密切关注它。

答案 1 :(得分:2)

为什么不直接使用NSDate?

NSDate *date1, *date2;
NSTimeInterval timeInSeconds;

date1 = [NSDate date];

// Do work

date2 = [NSDate date];
timeInSeconds = [date2 timeIntervalSinceDate:date1];

// Or, without using date2:

timeInSeconds = -[date1 timeIntervalSinceNow];

这应该使您的测量精度达到亚秒级。

答案 2 :(得分:1)

如果您想获得Unix-y,可以使用gettimeofdayreference):

struct timeval tv;
gettimeofday(&tv, NULL);
NSLog(@"seconds: %d, microseconds: %d\n", tv.tv_sec, tv.tv_usec);

请务必将#import <sys/time.h>添加到您的文件

答案 3 :(得分:0)

或者,如果您真的想要了解金属,可以按SO Q/A和/或Apple docs使用mach_absolute_time()