定时Objective-C代码

zou*_*oul 8 performance benchmarking objective-c

我想在Objective-C应用程序中添加一些自动化性能测试.(这是一款游戏,因此我想通过简单地运行一组测试来查看引擎关键部分的当前性能.)为此,我想编写一些时序支持例程,如下所示:

- (void) benchmarkSelector: (SEL) msg onObject: (id) target
{
    // run the selector thousands of times, print detailed stats
}
Run Code Online (Sandbox Code Playgroud)

问题是我对毫秒感兴趣,我担心调用performSelector基准测试代码会使结果偏差很多.你会怎么回事?我应该去objc_msgSend吗?

BJ *_*mer 11

使用methodForSelector:,返回一个指向实际实现的函数指针,如下所示:

IMP methodImp = [target methodForSelector:msg];
for (int i=0; i<1000; ++i) {
    NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
    methodImp(target, msg);

    NSTimeInterval duration = [NSDate timeIntervalSinceReferenceDate] - start;
    // Do something with duration
}
Run Code Online (Sandbox Code Playgroud)

请注意,此策略对于测量方法的实际运行时非常有用,但如果您要使用标准的Objective-C消息传递语法调用它,那么将消息传递开销包括在内则可能同样重要.你的测量.

另请注意,如果方法实际上接受任何其他参数,则应将结果methodForSelector:转换为具有适当参数的函数指针,以避免将浮点数意外转换为双精度等.有关更多信息和示例,请参阅NSObject类参考.

  • NSTimeInterval是双倍的.结果以秒为单位表示,但精度为亚毫秒级.由于OP正在寻找毫秒,我认为这已经足够了.但是,是的,mach_absolute_time()也会起作用. (2认同)