博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本篇译自:Matt Gallagher的blog-http://cocoawithlove.com
原文:http://cocoawithlove.com/2010/03/load-from-nib-or-construct-views-in.html

有人认为iPhone上用代码来构建加载窗口要比用nib文件来得更快。真的假的?下面文章做了一个实验,说明了这一问题:

简单介绍

这篇文章使用的Sample程序非常简单:一个包含了20行Cell的UITableview,每一行Cell又包含了20个UILabel,1个backgroundView,还有一个selectedBackgroundView。

计时只是在构建和加载的时候进行。像把cell加进UITableView、配置cell、屏幕绘制的过程没有进行计时,因为不管用代码还是用nib,这些过程都会有。

test

Sample Application

上图右手边,每个cell上的黑线是”placeholder”,被写了19次。

你可以下载工程:工程文件

创建Cell的代码
创建一个cell的代码如下:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell.backgroundView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
cell.backgroundView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
cell.selectedBackgroundView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
cell.selectedBackgroundView.backgroundColor = [UIColor colorWithWhite:0.85 alpha:1.0];
UILabel *firstLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 60, 20)] autorelease];
firstLabel.tag = 1;
firstLabel.font = [UIFont boldSystemFontOfSize:14];
firstLabel.shadowOffset = CGSizeMake(1,1);
firstLabel.textColor = [UIColor colorWithRed:0.0 green:0.2 blue:0.5 alpha:1.0];
firstLabel.backgroundColor = [UIColor clearColor];
firstLabel.text = @"placeholder";
firstLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
firstLabel.adjustsFontSizeToFitWidth = YES;
firstLabel.minimumFontSize = 10;
firstLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
firstLabel.lineBreakMode = UILineBreakModeTailTruncation;
firstLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
firstLabel.highlightedTextColor = [UIColor clearColor];
[cell addSubview:firstLabel];
// // Plus the construction of a further 19 labels... //

加载nib文件

有很多方法可以从nib文件中加载一个UITableViewCell。这里使用一个最快最简单的方法:

Objective-C
1
2
3
[[NSBundle mainBundle] loadNibNamed:@"Cell" owner:self options:nil];
cell = loadedCell;
loadedCell = nil;

模拟器结果

Generated in codeLoaded from NIB
Generated cell in 0.00153798 secondsLoaded cell in 0.00184 seconds
Generated cell in 0.00138998 secondsLoaded cell in 0.00168097 seconds
Generated cell in 0.00138199 secondsLoaded cell in 0.00168198 seconds
Generated cell in 0.00139898 secondsLoaded cell in 0.001706 seconds
Generated cell in 0.00167602 secondsLoaded cell in 0.001697 seconds
Generated cell in 0.00235301 secondsLoaded cell in 0.00171804 seconds
Generated cell in 0.00137097 secondsLoaded cell in 0.002105 seconds
Generated cell in 0.00138301 secondsLoaded cell in 0.00173801 seconds
Generated cell in 0.00140399 secondsLoaded cell in 0.00171405 seconds
Generated cell in 0.00137198 secondsLoaded cell in 0.001692 seconds

通过nib文件的方式加载比用代码加载慢了将近20%。但是,每次加载只是慢1毫秒左右,关系并不是很大。

真机测试结果
下面这个表是用iPhone 3G测试的:

Generated in codeLoaded from NIB
Generated cell in 0.113011 secondsLoaded cell in 0.131085 seconds
Generated cell in 0.114312 secondsLoaded cell in 0.097244 seconds
Generated cell in 0.101614 secondsLoaded cell in 0.08413 seconds
Generated cell in 0.105022 secondsLoaded cell in 0.081331 seconds
Generated cell in 0.10087 secondsLoaded cell in 0.093407 seconds
Generated cell in 0.105968 secondsLoaded cell in 0.083472 seconds
Generated cell in 0.100045 secondsLoaded cell in 0.091788 seconds
Generated cell in 0.105458 secondsLoaded cell in 0.083763 seconds
Generated cell in 0.098836 secondsLoaded cell in 0.08714 seconds
Generated cell in 0.102028 secondsLoaded cell in 0.109811 seconds

从上面结果上来看,构建第一个cell时代码的方式要快15%,但是从第三个cell开始nib方式要快17%。

用CPU sampling的工具测试了一下。发现adjustsFontSizeToFitWidth 的方法比较慢。这个方法是Interface Builder用来预先计算字的大小的。我们不要用这个方法。修改代码和nib文件(label.adjustsFontSizeToFitWidth = NO、使用Cell2.xib)后,运行得到下面的结果:

Generated in codeLoaded from NIB
Generated cell in 0.085553 secondsLoaded cell in 0.095012 seconds
Generated cell in 0.077257 secondsLoaded cell in 0.087141 seconds
Generated cell in 0.084639 secondsLoaded cell in 0.082693 seconds
Generated cell in 0.079142 secondsLoaded cell in 0.098218 seconds
Generated cell in 0.078286 secondsLoaded cell in 0.082136 seconds
Generated cell in 0.087895 secondsLoaded cell in 0.087088 seconds
Generated cell in 0.0792 secondsLoaded cell in 0.082335 seconds
Generated cell in 0.084037 secondsLoaded cell in 0.082358 seconds
Generated cell in 0.076416 secondsLoaded cell in 0.08714 seconds
Generated cell in 0.078426 secondsLoaded cell in 0.084312 seconds

现在,代码方式快了7%。

结论:
不要做出这样的假设,nib文件总是比写代码的方式慢。在一般情况下,使用代码方式生成view比用nib的方式快5%~10%。使用nib文件虽然比较慢,但是差别非常小,没有关系。况且有时候用nib文件要比用代码来得快。

这并不意味着在iphone中UI的速度无关紧要。我曾经写过加载要用2秒的view。这是不能接受的。但是节省10%的nib时间,也不会解决这个问题。在这种情况下,减少view深度,或将text field删除是优化性能的最好方法。这样做能让程序快上10倍或者更多。

用还是不用nib,完全看你的选择。原则就是自己coding舒服并且程序没有性能问题。不要太在意这两个方法的性能差异。

 

转 http://www.wangdg.com/?p=485

posted on 2012-04-13 15:50  Likwo  阅读(2349)  评论(0编辑  收藏  举报