我想在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类参考以获取更多信息和示例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top