今天看到一篇关于iOS应用性能优化的文章,其中提到计算代码的运行时间,觉得非常有用,值得收藏。不过在模拟器和真机上是有差异的,以此方法观察程序运行状态,提高效率。
第一种:(最简单的NSDate)
NSDate* tmpStartData = [NSDate date];//You code here...double deltaTime = [[NSDate date] timeIntervalSinceDate:tmpStartData];NSLog(@"cost time = %f", deltaTime);
第二种:(将运行代码放入下面的Block中,返回时间)
#import// for mach_absolute_time() and friendsCGFloat BNRTimeBlock (void (^block)(void)) {mach_timebase_info_data_t info;if (mach_timebase_info(&info) != KERN_SUCCESS) return -1.0;uint64_t start = mach_absolute_time ();block ();uint64_t end = mach_absolute_time ();uint64_t elapsed = end - start;uint64_t nanos = elapsed * info.numer / info.denom;return (CGFloat)nanos / NSEC_PER_SEC;}
第三种:
/*** 计算脚本时间* @param $last 最后一次的运行clock* @param $key 标识* @return 当前clock*/double t(double last, char* key){clock_t now = clock();printf("time:%fs \t key:%s \n", (last != 0) ? (double)(now - last) / CLOCKS_PER_SEC : 0, key);return now;}double t1 = t(0, "");//do somethingt(t1, "end");
飘飘白云文中说到,对于UIImage载入图像的方法,下面第一种更为高效,因为iOS会自带 cache 载入图像。
+ (UIImage *)imageNamed:(NSString *)name;- (id)initWithContentsOfFile:(NSString *)path;
但是,imageNamed方法只能载入bundle中的文件,如网络图像解析就无能为力了。
正好这里总结到计算代码运行时间,就以此为例看看两种方法到底谁更高效,这里我用最简单的NSDate计算耗时:
for (int i=0 ; i<10000; i++) {UIImage *image = [UIImage imageNamed:@"icon.png"];// UIImage *image = [[UIImage alloc] initWithContentsOfFile:@"icon.png"];image = nil;}double deltaTime = [[NSDate date] timeIntervalSinceDate:tmpStartData];NSLog(@"cost time = %f", deltaTime);
输出结果:
cost time = 0.022821 //imageNamedcost time = 0.102620 //initWithContentsOfFile
这里图片我用的一张1024x1024像素的png,可见两种加载图像的方法耗时差别还是挺大的。
部分引用自: