定时Objective-C代码
-
06-07-2019 - |
题
我想在Objective-C应用程序中添加一些自动性能测试。 (这是一个游戏,所以我想通过简单地运行一组测试来查看引擎关键部分的当前性能。)为此,我想写一些时序支持例程,如下所示:
- (void) benchmarkSelector: (SEL) msg onObject: (id) target
{
// run the selector thousands of times, print detailed stats
}
问题是我对毫秒感兴趣,我担心在基准测试代码中调用 performSelector
会使结果偏差很多。你会怎么回事?我应该去 objc_msgSend
?
解决方案
使用 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:
的结果转换为具有相应参数的函数指针,以避免意外将浮点数转换为双精度数等请参阅 NSObject类参考以获取更多信息和示例。
不隶属于 StackOverflow