如何准确地以毫秒为单位记录方法的执行时间?
在OS X上,要精确计时,你应该使用在
#include#include // 做一些准备计时的工作 const uint64_t startTime = mach_absolute_time(); // 做一些你想要计时的工作 const uint64_t endTime = mach_absolute_time(); // 以Mach时间单位表示的经过的时间 const uint64_t elapsedMTU = endTime - startTime; // 获取用于将MTU转换为纳秒的信息 mach_timebase_info_data_t info; if (mach_timebase_info(&info)) handleErrorConditionIfYoureBeingCareful(); // 以纳秒表示的经过时间: const double elapsedNS = (double)elapsedMTU * (double)info.numer / (double)info.denom;
当然,通常的细粒度测量注意事项也适用;你最好多次调用被测试的例程,并进行平均/取最小值/进行其他形式的处理。
此外,请注意,你可能会发现使用Shark等工具对运行中的应用程序进行性能分析更有用。这不会给出精确的时间信息,但它会告诉你应用程序的时间的百分比花费在哪里,这通常更有用(但不总是)。
尝试让它在Swift中工作...有什么建议吗?
"这并不简单...转换成Swift" - Ned Stark
请参考我的答案,其中有一个在Swift中实现的示例。
如何精确记录方法执行时间(以毫秒为单位)?
问题出现的原因是我们想要在代码中记录方法的执行时间,以便分析和优化代码性能。
解决方法是使用宏定义来实现。下面是两个一行代码的宏定义:
#define TICK NSDate *startTime = [NSDate date] #define TOCK NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])
我们可以像这样使用它:
TICK;
/* ... 在这里执行一些操作 ... */
TOCK;
这个解决方法之所以好用,是因为"tick-tock"是一个容易记住的短语,几乎不需要思考就可以进行日志记录。
#define TOCK NSLog(@"%s Time: %f", __func__, -[startTime timeIntervalSinceNow])
可以让这个解决方法返回使用计时器的函数名称。如果我们要对多个函数进行计时,这个功能会非常有用。
还有一个很棒的想法!如果你想要更详细的信息,你还可以查看__PRETTY_FUNCTION__
和__LINE__
。
虽然"Tick/Tock"很酷,但是最好不要使用NSDate来进行精确计时。
如何以毫秒级精度记录方法的执行时间?
有时候我们需要记录一个方法的执行时间,以便进行性能优化或者调试。下面是几种不同编程语言中记录方法执行时间的方法:
Objective-C:
NSDate *methodStart = [NSDate date]; /* ... Do whatever you need to do ... */ NSDate *methodFinish = [NSDate date]; NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart]; NSLog(@"executionTime = %f", executionTime);
Swift:
let methodStart = NSDate()
/* ... Do whatever you need to do ... */
let methodFinish = NSDate()
let executionTime = methodFinish.timeIntervalSinceDate(methodStart)
print("Execution time: \(executionTime)")
Swift 3:
let methodStart = Date()
/* ... Do whatever you need to do ... */
let methodFinish = Date()
let executionTime = methodFinish.timeIntervalSince(methodStart)
print("Execution time: \(executionTime)")
这些方法都非常简单易用,并且具有亚毫秒级的精度。返回的值是秒数,如果想要以毫秒为单位记录,可以使用%f格式化字符串来打印日志。例如,可以使用下面的代码来打印以毫秒为单位的方法执行时间:
NSLog(@"executionTime = %f", executionTime);
总结起来,使用NSDate或者Date类来记录方法执行时间非常方便,同时也具有较高的精度。需要注意的是,NSDate和Date类在记录时间时不受时区、夏令时、闰秒等因素的影响,因此非常可靠。
另外,某些情况下了使用mach_absolute_time()函数来记录时间的方法。这个方法也可以达到很高的精度,但是需要注意的是,它的返回值单位是CPU时钟周期,需要进行转换才能得到实际的时间值。因此,使用NSDate或者Date类来记录方法执行时间更加简单和直观。
在实际的开发中,如果需要更精确的时间记录,可以考虑使用CFAbsoluteTimeGetCurrent()函数。该函数返回的是一个双精度浮点数,单位是秒,可以直接用于计算方法执行时间。例如:
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); /* ... Do whatever you need to do ... */ CFAbsoluteTime finish = CFAbsoluteTimeGetCurrent(); NSTimeInterval executionTime = finish - start; NSLog(@"Execution time: %f", executionTime);
记录方法执行时间是一个常见的需求,在不同的编程语言中有多种方法可以实现。根据具体的需求和精度要求,可以选择合适的方法来记录方法执行时间。