objective-c gettimeofday功能替代品

时间:2014-03-20 12:29:32

标签: objective-c gettimeofday

我在我的程序中使用gettimeofday来表示时间间隔:

struct timeval currentTime, startTime; 
gettimeofday(&startTime, NULL);
startTime.tv_usec /= 1000;
gettimeofday(&currentTime, NULL);
currentTime.tv_usec /= 1000;

long int msSinceStart = (currentTime.tv_usec + (1000 * currentTime.tv_sec) ) - (startTime.tv_usec + (1000 * startTime.tv_sec) );

有没有替代方案?

4 个答案:

答案 0 :(得分:2)

@ user2282782在评论中注意到问题背后的真正问题是警告gettimeofday is invalid in c99在编译时被抛出。

要解决这个问题,正如@Emmanuel指出的那样,只需添加:
#include <sys/time.h>到文件的顶部。这也解决了我同样的问题。

答案 1 :(得分:1)

Objective-C替代方案是NSDate。

NSDate *startTime = [NSDate date];
NSTimeInterval secondsSinceStart = -[startTime timeIntervalSinceNow];

当然,如果你想要一个高分辨率时间,你应该使用mach_absolute_time(见https://developer.apple.com/library/mac/qa/qa1398/_index.html)。

答案 2 :(得分:1)

您还可以使用CFAbsoluteTimeGetCurrent

CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();

并获得已经过的秒数:

CFTimeInterval elapsed = CFAbsoluteTimeGetCurrent() - start;

注意,CFAbsoluteTimeGetCurrent的{​​{3}}警告我们:

  

重复调用此函数并不能保证单调增加结果。由于与外部时间参考同步或由于时钟的明确用户更改,系统时间可能会减少。

这意味着,如果您不幸测量其中一次调整所经过的时间,则最终可能会计算出错误的经过时间。此警告也适用于NSDate和类似功能。要解决此问题,您可以使用documentation

CFTimeInterval start = CACurrentMediaTime();

CFTimeInterval elapsed = CACurrentMediaTime() - start;

这使用了mach_absolute_time,但避免了CACurrentMediaTime中列出的一些复杂性。

答案 3 :(得分:0)

现在要解决此问题,您应该在文件中插入以下内容:

#import <UIKit/UIKit.h>