定时Objective-C代码

时间:2009-06-23 06:15:13

标签: objective-c performance benchmarking

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

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

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

1 个答案:

答案 0 :(得分: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
}

请注意,此策略对于测量方法的实际运行时非常有用,但如果您要使用标准的Objective-C消息传递语法调用它,那么包含消息可能与其相关 - 在你的测量中传递开销。

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