iPhone中方法调用的CPU和内存使用情况

时间:2013-04-11 17:40:59

标签: ios objective-c memory cpu-usage

我正在尝试为我的iPhone应用程序的方法调用添加一些性能统计数据。我使用以下内容来查找处理时间:

#define TICK   NSDate *startTime = [NSDate date]
#define TOCK   NSLog(@"Time to process: %f", -[startTime timeIntervalSinceNow])

是否有类似的策略来衡量方法调用的CPU和内存使用情况?

4 个答案:

答案 0 :(得分:2)

使用Instruments检查应用的效果。 Apple已经做了相当不错的工作,因此无需重新发明轮子。

答案 1 :(得分:1)

使用仪器在真实设备上实际使用这些测量值。

答案 2 :(得分:1)

你将不得不做一些工作来使这个工作,但这是你如何做到这一点。

  • 从这个SO answer,您可以了解如何获得当前的CPU使用率。
  • 从这个SO answer,您可以了解如何获取当前的内存使用情况。

现在你可以产生一个新的线程,定期或按需检查CPU和内存,然后创建一个类,如下所示:

@interface ProfilerBlock
-(id) init;
-(void) end;
@end
  • init 方法应初始化当前时间并注册 ProfilerBlock 实例,以从工作线程获取有关内存使用情况和CPU使用情况的信息。
  • end 方法应计算时间并打印所有需要的信息或将其写入文件或其他内容:)

现在为 ProfilerBlock

创建一个C风格的释放函数
static void __$_Profiler_Block_Release_Object_$__(ProfilerBlock **obj) // the long name is just to prevent duplicated symbol names //
{
    [(*obj) end];
    [(*obj) release];
    (*obj) = nil;
}

最后,您可以创建宏来让您的生活更轻松:

#define CONCAT2(x, y) x ## y
#define CONCAT(x, y) CONCAT2(x, y)
#define PROFILER_SCOPE_OBJECT __attribute__((cleanup(__$_Profiler_Block_Release_Object_$__)))
#define PROFILE_BLOCK ProfilerBlock *CONCAT(__profilerBlock_, __LINE__) PROFILER_SCOPE_OBJECT = [[ProfilerBlock alloc] init];

完成所有这些后,您可以分析如下方法:

-(void) methodToProfile
{
    PROFILE_BLOCK
    // add some code to profile here //
    // the "end" function will get called automatically after the method is done, even if you return early, allowing you to process the profiled data //
}

我希望这会有所帮助,对不起,如果我没有详细介绍如何测量内存和CPU,但我相信其他答案已经很好地介绍了它。

答案 3 :(得分:0)

 NSTimeInterval t1 = [[NSDate date] timeIntervalSince1970];

....自定义流程......

 NSTimeInterval t2 = [[NSDate date] timeIntervalSince1970];
 NSTimeInterval dt = t2-t1; this is in milisec;