我想在Objective-C应用程序中添加一些自动性能测试。 (这是一个游戏,所以我想通过简单地运行一组测试来看到引擎关键部分的当前性能。)为此,我想写一些时序支持例程,如下所示:
- (void) benchmarkSelector: (SEL) msg onObject: (id) target
{
// run the selector thousands of times, print detailed stats
}
问题是我对毫秒感兴趣,我担心在基准测试代码中调用performSelector
会使结果偏差很多。你会怎么回事?我应该去objc_msgSend
吗?
答案 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}}了解更多信息和示例。