我会调用什么对象/方法来获取当前时间(以毫秒为单位)(或高精度)来帮助测量方法执行的时间长度?
NSDate的timeIntervalSinceDate将返回以秒为单位测量的NSInterval。我正在寻找更精细的东西,类似于Java的System.currentTimeMillis。
objective-c / CocoaTouch中是否有相同的版本?
答案 0 :(得分:25)
对于OS X上非常细粒度的计时,我使用mach_absolute_time( )
,<mach/mach_time.h>
中定义了#include <mach/mach_time.h>
#include <stdint.h>
static double ticksToNanoseconds = 0.0;
uint64_t startTime = mach_absolute_time( );
// Do some stuff you want to time here
uint64_t endTime = mach_absolute_time( );
// Elapsed time in mach time units
uint64_t elapsedTime = endTime - startTime;
// The first time we get here, ask the system
// how to convert mach time units to nanoseconds
if (0.0 == ticksToNanoseconds) {
mach_timebase_info_data_t timebase;
// to be completely pedantic, check the return code of this next call.
mach_timebase_info(&timebase);
ticksToNanoseconds = (double)timebase.numer / timebase.denom;
}
double elapsedTimeInNanoseconds = elapsedTime * ticksToNanoseconds;
。您可以按如下方式使用它:
{{1}}
答案 1 :(得分:9)
实际上,+[NSDate timeIntervalSinceReferenceDate]
会返回NSTimeInterval
,这是double的typedef。文档说
NSTimeInterval总是以秒为单位指定;它在10,000年的范围内产生亚毫秒精度。
因此,使用毫秒精度计时是安全的。我一直这样做。
答案 2 :(得分:4)
不要使用NSDate
。调用方法和实例化对象,甚至释放内部内容,都会失去很多精确度。你只是没有足够的控制力。
使用time.h
或Stephen Canon建议mach/mach_time.h
。它们都更准确。
执行此操作的最佳方法是启动Instruments或Shark,将它们附加到您的进程(即使它已在运行时也能正常运行)并让它们测量方法所需的时间。
熟悉它之后,所需的时间比任何机器时间功能和重新编译整个应用程序解决方案的时间更短。你甚至可以获得更多的信息。我不会满足于任何东西。
答案 3 :(得分:2)
timeIntervalSinceReferenceDate
完全没问题。
然而,除非这是一个长期运行的方法,否则这不会带来太多成果。当你谈论几毫秒的执行时,执行时间可能会有很大差异。如果您的线程/进程在中途被抢占,则会出现非确定性峰值。基本上,您的样本量太小。使用分析器或运行100,000次迭代来获得总时间并除以100,000以获得平均运行时间。
答案 4 :(得分:1)
如果您正在尝试调整代码的性能,那么最好使用Instruments或Shark来全面了解应用在哪些方面花费时间。
答案 5 :(得分:1)
我将在此处的另一篇文章中重新发布我的答案。请注意,我对此复杂问题的简单解决方案使用NSDate和NSTimeInterval作为其基础:
我知道这是一个旧的,但即使我发现自己再次徘徊,所以我想我会在这里提交自己的选择。
最好的办法是查看我的博文: Timing things in Objective-C: A stopwatch
基本上,我写了一个以非常基本的方式停止观看的课程,但是封装了以便你只需要做以下事情:
[MMStopwatchARC start:@"My Timer"];
// your work here ...
[MMStopwatchARC stop:@"My Timer"];
你最终得到:
MyApp[4090:15203] -> Stopwatch: [My Timer] runtime: [0.029]
在日志中......
再次,请查看我的帖子以获取更多信息或在此处下载: MMStopwatch.zip
答案 6 :(得分:0)
@bladnman我喜欢你的秒表事情..我一直都在使用它..这是我编写的一个小块,它消除了关闭调用的需要,并使它更加容易(如果这看起来甚至可能)使用,大声笑。
+(void)stopwatch:(NSString*)name timing:(void(^)())block {
[MMStopwatch start:name];
block();
[MMStopwatch stop: name];
}
然后你可以在任何地方调用它。
[MMStopwatch stopwatch:@"slowAssFunction" timing:^{
NSLog(@"%@",@"someLongAssFunction");
}];
↪someLongAssFunction
-> Stopwatch: [slowAssFunction] runtime:[0.054435]
你应该把这个吸盘发布到github - 所以人们可以轻松找到它/贡献等等。这很棒。感谢。