// Get a current time for where you want to start measuring from
NSDate *date = [NSDate date];
// do work...
// Find elapsed time and convert to milliseconds
// Use (-) modifier to conversion since receiver is earlier than now
double timePassed_ms = [date timeIntervalSinceNow] * -1000.0;
// Get a current time for where you want to start measuring from
var date = NSDate()
// do work...
// Find elapsed time and convert to milliseconds
// Use (-) modifier to conversion since receiver is earlier than now
var timePassed_ms: Double = date.timeIntervalSinceNow * -1000.0
11 回答
NSDate
和timeIntervalSince*
方法将返回NSTimeInterval
,这是一个精度为亚毫秒的双精度 .NSTimeInterval
以秒为单位,但它使用双精度来提供更高的精度 .为了计算毫秒时间精度,您可以:
Documentation on timeIntervalSinceNow .
还有很多其他方法可以使用
NSDate
计算这个间隔,我建议查看NSDate
的类文档,该文档位于NSDate Class Reference中 .mach_absolute_time()
可用于获得精确测量 .见http://developer.apple.com/qa/qa2004/qa1398.html
也可以使用
CACurrentMediaTime()
,它本质上是相同的,但具有更易于使用的界面 .请勿使用
NSDate
,CFAbsoluteTimeGetCurrent
或gettimeofday
来测量经过的时间 . 这些都取决于系统时钟,由于许多不同的原因,系统时钟可以随时改变,例如更新时钟的网络时间同步(NTP)(经常调整漂移),DST调整,闰秒等 .这意味着,如果您正在测量下载或上传速度,您的数字会突然出现峰值或下降,与实际发生的情况无关;你的性能测试会有奇怪的错误异常值;并且您的手动计时器将在不正确的持续时间后触发 . 时间甚至可能倒退,你最终得到负增量,你最终会得到无限递归或死代码(是的,我已经完成了这两个) .
使用
mach_absolute_time
. 它测量自内核启动以来的实际秒数 . 它是单调增加的(永远不会倒退),并且不受日期和时间设置的影响 . 既然's a pain to work with, here'是一个简单的包装器,可以给你NSTimeInterval
:CFAbsoluteTimeGetCurrent()将绝对时间作为
double
值返回,但我不知道它的精度是什么 - 它可能只会每十几毫秒更新一次,或者它可能每微秒更新一次,我不知道 .我不会使用
mach_absolute_time()
因为它使用ticks(可能是正常运行时间)查询内核和处理器的组合绝对时间 .我会用什么:
此功能经过优化,可以纠正iOS和OSX软件和硬件的差异 .
Something Geekier
mach_absolute_time()
和AFAbsoluteTimeGetCurrent()
之差的商总是大约24000011.154871这是我的应用程序的日志:
Please note that final result time is a difference in CFAbsoluteTimeGetCurrent()'s
用法:
输出:
此外,以下是如何计算以毫秒为单位初始化的64位
NSNumber
,以防您希望如何将其存储在CoreData中 . 我需要这个用于我的应用程序,它与以这种方式存储日期的系统交互 .基于
mach_absolute_time
的功能适用于短测量 .但对于长时间的测量,重要的警告是它们在设备睡着时停止滴答作响 .
自启动以来有一个获取时间的功能 . 它在睡觉时不会停止 . 此外,
gettimeofday
不是单调的,但在我的实验中,我总是看到启动时间在系统时间改变时发生变化,所以我认为它应该可以正常工作 .从iOS 10和macOS 10.12开始我们可以使用CLOCK_MONOTONIC:
把它们加起来:
Date.timeIntervalSinceReferenceDate
- 系统时间更改时更改,而不是单调CFAbsoluteTimeGetCurrent()
- 不单调,可能会后退CACurrentMediaTime()
- 当设备处于睡眠状态时停止滴答timeSinceBoot()
- 不睡觉,但可能不是单调的CLOCK_MONOTONIC
- 从iOS 10开始不支持睡眠,单调,支持我知道这是一个旧的,但即使我发现自己再次徘徊,所以我想我会在这里提交自己的选择 .
最好的办法是查看我的博文:Timing things in Objective-C: A stopwatch
基本上,我写了一个类,它以一种非常基本的方式停止观看,但是被封装,所以你只需要做以下事情:
你最终得到:
在日志中......
再次,查看我的帖子多一点或下载它:MMStopwatch.zip
对于那些我们需要Swift版本@Jeff Thompson的答案:
我希望这对你有帮助 .
您可以使用NSDate获取1970年1月1日以来的当前时间(以毫秒为单位):