8

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

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

问题是我对毫秒感兴趣,我担心调用performSelector基准测试代码会使结果产生很大偏差。你会如何解决这个问题?我应该去objc_msgSend吗?

4

1 回答 1

11

Use 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 类参考

于 2009-06-23T06:33:10.867 回答