如何在仪器中调查非CPU密集型方法调用?

时间:2011-04-05 22:50:54

标签: objective-c xcode time profile instruments

如果我有以下方法,有没有办法使用Instruments 4.0告诉我它花了一秒钟?

- (IBAction)sleepOneSecond:(id)sender 
{
    sleep(1);
}

现在我正在使用它来获得所需的效果:

- (IBAction)waitOneSecond:(id)sender 
{
    NSDate * startDate = [NSDate date];
    sleep(1);
    NSLog(@"%s took %lf seconds", __FUNCTION__, 
          [[NSDate date] timeIntervalSinceDate:startDate]);
}

时间分析器和采样器只是在CPU上给出时间,在这种情况下无效。

2 个答案:

答案 0 :(得分:3)

使用Time Profiler仪器,确保将其设置为“All Sample Counts”,而不是“Sample Perspective”下的“Running Sample Times”。

答案 1 :(得分:2)

仪器中的时间分析器不是为各个方法调用确定准确的时序,它需要运行的应用程序的定期样本来确定代码在采样时CPU执行指令的位置。然后,它会获取所有样本并估计每个方法或函数花费的总时间。这称为随机抽样,它不会在呼叫开始和结束时进行测量。它只是估计在代码的不同部分花费的相对时间,并且用于计算CPU花费大部分时间的程序部分,以便您可以专注于这些部分以进行优化。通常大部分时间都花费在内循环中的几个方法中,花费时间在其他任何地方优化代码都是浪费,因为仅在2%的时间内执行的速度加倍只会使代码速度提高1%。

因此,如果您想要准确了解给定代码段执行的时间长度,那么您将需要执行的操作类似于您正在执行的操作。许多人使用某种宏来轻松地进行时间测量以及开始和结束,计算差异并记录它或通过该代码和平均值多次节省时间。当然,这种技术的问题在于测量本身涉及一些开销(想想Heisenberg)。您可以通过在测量之前和之后进行最小化,中间没有代码,并使用实际代码在之前和之后的调用之间减去后续测量中的此开销数。

要执行您要执行的操作,您还可以自动查看DTrace。