如何准确地以毫秒为单位记录方法的执行时间?

37 浏览
0 Comments

如何准确地以毫秒为单位记录方法的执行时间?

有没有一种方法可以确定一个方法执行所需要的时间(以毫秒为单位)?

0
0 Comments

在OS X上,要精确计时,你应该使用在中声明的mach_absolute_time()函数:

#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中实现的示例。

0
0 Comments

如何精确记录方法执行时间(以毫秒为单位)?

问题出现的原因是我们想要在代码中记录方法的执行时间,以便分析和优化代码性能。

解决方法是使用宏定义来实现。下面是两个一行代码的宏定义:

#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来进行精确计时。

0
0 Comments

如何以毫秒级精度记录方法的执行时间?

有时候我们需要记录一个方法的执行时间,以便进行性能优化或者调试。下面是几种不同编程语言中记录方法执行时间的方法:

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);

记录方法执行时间是一个常见的需求,在不同的编程语言中有多种方法可以实现。根据具体的需求和精度要求,可以选择合适的方法来记录方法执行时间。

0