iOS平台下可对APP的CPU、FPS、Memory、LoadingTime进行内部统计的一款工具,并提供统计数据的输出。
有项目需求,所以做了这款性能分析工具。正如简介所说,它可以统计iOS APP的CPU、FPS、Memory、LoadingTime。由于我在工具内部设定的是默认0.5秒统计一次所有数据(FPS除外,它一秒统计一次)故而内存开销可能比较大,所以如果你特别在意内存,建议只统计内存,把其它统计项关掉,至于怎么关掉,可以看看后文的详解。
只需要把PerformanceAnalyzer文件夹包含进入你的工程,然后修改一下main.m
文件少许代码就可以启动性能分析器,你甚至都不用包含任何文件。
-
将我传入的
PerformanceAnalyzer
文件夹复制到你的工程。选择项目工程
->Build Phases
->Link Binary With Libraries
把libPerformanceAnalyzer.a
添加进去。 -
你不需要包含
CHPerformanceAnalyzer.h
。 -
把项目的
main.m
改成main.mm
,在main函数中调用startPerformanceAnalyzer()
方法。可以参考下面的代码,你需要前置声明extern void startPerformanceAnalyzer()
,因为这个方法存在于性能分析器静态库中,它的作用就是启动性能分析,这个函数将不会做任何多余的工作,它其实就是一个空函数,仅仅是为了把libPerformanceAnalyzer.a中的符号导入到你的工程中。extern void startPerformanceAnalyzer(); int main(int argc, char * argv[]) { @autoreleasepool { startPerformanceAnalyzer(); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
-
请运行工程,尽情使用吧!
你可以在全局的任何地方定义CHPerformanceAnalyzerShowType CHPerformanceAnalyzerShowTypeSetting;
来控制统计项,它的值请看CHPerformanceAnalyzer.h中的定义。
一般来说,你的app delegate(遵从UIApplicationDelegate协议的类)是AppDelegate,如果不是怎么办呢,你只需要在全局的任何地方定义NSString *CHPerformanceAnalyzerApplicationDelegateClassName = @"YourAppDelegate";
即可。
在我上传的
PerformanceAnalyzer
文件夹下有CHPerformancerExterns.m
,你可以在这里面完成上面的操作,默认地,这里面已经有一些内容了,你可以做适当修改。
- 当你用两根手指连续点击统计界面2次就会将当前的统计数据保存到沙盒。
- CHPerformanceAnalyzer有一个delegate,它遵从CHPerformanceAnalyzerDelegate协议,这个协议有个可选方法
- (void)performanceAnalysis:completeWithFilePath:
,每当你触发了保存操作后,它就会被调用。它会告诉你数据保存的位置。 - analyzer把统计数据保存在了沙盒的共享目录下,你可以给工程的info.plist添加'Application supports iTunes file sharing'字段,并设置为
YES
,你就可以把手机连上iTunes,在应用
界面,向下滑到'文件共享'栏,选择你的APP,就会看到下图:performance.txt
就是统计数据了。 - 统计数据的格式是Excel的csv格式,它是可以直接导入Excel的,具体教程请看这里。analyzer的默认的数据分隔符是英文逗号,请记得选择。转换的时候,可能有编码问题,如果出现这个问题,建议先把原始数据转换成中文编码再导入。
如果有的view controller比较特殊,需要延迟一会儿才能加载完整个界面,而此时- (void)viewDidAppear:
已经被调用过。此时,需要自己去定制一个方法去表示END FLAG并替换analyzer的END FLAG。你可以查看我在PerformanceAnalyzer里面的CHPerformancerExterns.mm文件。为了方便解释,这里贴出代码:
@interface WebViewController (PageLoading)
@end
@implementation WebViewController (PageLoading)
- (void)viewDidAppear_aop2:(BOOL)animated
{
CHPerformanceAnalyzer *analyzer = [CHPerformanceAnalyzer sharedPerformanceAnalyzer];
// 反观察者模式,让analyzer成为这个'self'的观察者,去关注属性路径'navigationItem.title'
[analyzer addObservered:self forKeyPath:@"navigationItem.title"];
// 这句只能在上面的后面,颠倒位置将不会正确统计信息
[self viewDidAppear_aop2:animated];
}
- (void)viewDidDisappear_aop:(BOOL)animated
{
[self viewDidDisappear_aop:animated];
CHPerformanceAnalyzer *analyzer = [CHPerformanceAnalyzer sharedPerformanceAnalyzer];
// 这句要与'[analyzer addObservered:self forKeyPath:@"navigationItem.title"];'成对出现,否则将会抛出异常,因为底层的实现就是观察者模式。
[analyzer removeObservered:self forKeyPath:@"navigationItem.title"];
}
@end
void(^CHPerformanceAnalyzerAOPInitializer)() = ^{
CHPerformanceAnalyzer *analyzer = [CHPerformanceAnalyzer sharedPerformanceAnalyzer];
[analyzer registerLoadingRuleWithClass:[WebViewController class]
originalSelector:@selector(viewDidAppear:)
newSEL:@selector(viewDidAppear_aop2:)];
[analyzer registerLoadingRuleWithClass:[WebViewController class]
originalSelector:@selector(viewDidDisappear:)
newSEL:@selector(viewDidDisappear_aop:)];
};
我们加载一个网页的时候,当调用了协议方法- (void)webViewDidFinishLoad:
后,就代表网页加载完毕了,我在这个方法中更改了navigation的标题。
[analyzer addObservered:self forKeyPath:@"navigationItem.title"]
的作用就是让analyzer作为Controller的观察者,观察Controller的navigationItem.title
属性路径,当发生了新值变化后,analyzer就会收到对应通知,此时analyzer就会更新页面的加载时间。你也可以关注其它属性路径,我这儿只是抛砖引玉。
其中[self viewDidAppear_aop2:animated]
和在CHPerformanceAnalyzerAOPInitializer
block中的
[analyzer registerLoadingRuleWithClass:[WebViewController class]
originalSelector:@selector(viewDidAppear:)
newSEL:@selector(viewDidAppear_aop2:)];
这两句的代码以及顺序不能颠倒,这两句采用了AOP技术,更新内部实现。
注意:不能使用viewDidAppear_aop
作为你的自定义函数名字,analyzer内部采用了这个名字,如果不幸,你这样使用,将会进入无限递归直至爆栈。
你可以设置analyzer的skipModules属性的值,来跳过一些模块的统计。
摇晃手机就可以关闭anayzer,再次摇晃就会开启。
- Module的名字来自navigationItem的title属性,请设置它的属性,如果没有analyzer就会从它的titleView中查找,如果没有就会为null。
- 每个View Controller的加载时间是从调用
- (void)loadView
前开始,直到调用完- (void)viewDidAppear:
- 更多信息,请查看我的CHPerformanceAnalyzer.h,这里面的注释很详尽。
- 关于libPerformanceAnalyzer.a,它包含了模拟器和真机的Debug和Release版本的链接库信息,所以比较大。
- Email:[email protected] 欢迎来信告诉我bug!也欢迎交流!
- QQ:947702755