我在程序中使用gettimeofday作为时间间隔,如下所示:
struct timeval currentTime, startTime;
gettimeofday(&startTime, NULL);
startTime.tv_usec /= 1000;
gettimeofday(¤tTime, NULL);
currentTime.tv_usec /= 1000;
long int msSinceStart = (currentTime.tv_usec + (1000 * currentTime.tv_sec) ) - (startTime.tv_usec + (1000 * startTime.tv_sec) );
有其他选择吗?
@user2282782在他们的评论中指出,问题背后的真正问题是警告gettimeofday is invalid in c99
在编译时被抛出。
要解决这个问题,正如@Emmanuel指出的,只需添加:
将#include <sys/time.h>
移到文件的顶部。这也解决了我同样的问题。
您也可以使用CFAbsoluteTimeGetCurrent
:
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
,并获取已经过的秒数:
CFTimeInterval elapsed = CFAbsoluteTimeGetCurrent() - start;
注意,CFAbsoluteTimeGetCurrent
的文档警告我们:
反复调用此函数不能保证结果单调递增。由于与外部时间参考同步或由于用户显式更改时钟,系统时间可能会减少。
这意味着,如果您不幸在发生这些调整之一时测量运行时间,那么最终可能会得到不正确的运行时间计算。这个警告也适用于NSDate
和类似的函数。要解决这个问题,您可以使用CACurrentMediaTime
:
CFTimeInterval start = CACurrentMediaTime();
和
CFTimeInterval elapsed = CACurrentMediaTime() - start;
这使用了mach_absolute_time
,但避免了在Technical Q&A QA1398中概述的一些复杂性。
Objective-C的备选方案是NSDate。
NSDate *startTime = [NSDate date];
NSTimeInterval secondsSinceStart = -[startTime timeIntervalSinceNow];
当然,如果你想要一个高分辨率的时间,你应该使用mach_absolute_time(参见https://developer.apple.com/library/mac/qa/qa1398/_index.html)。
现在要解决这个问题,您应该在文件中插入以下内容:
#import <UIKit/UIKit.h>