在本章,你会学到以下东西:

  • 网络和文件IO处理如何影响app性能

  • 和缓存算法相关的一般问题和技术

  • iPhone缓存技术中的特定问题

           1)    你应该缓存什么

           2)    你应该什么时候缓存

           3)    如何实现缓存

           4)    你应该在哪里缓存数据和图片

  • 内存消耗和性能之间的权衡


对于如今大多数的apps,开发者通常从他们自己的服务器加载数据或者从第三方服务获取数据。比较少的apps会将数据存储在文件系统中,然后在必要的时候加载显示给用户。几乎没有apps不使用网络或文件IO。因此,理解这些处理类型产生的影响,能够帮助你更简单的定位和解决问题。


网络,文件,内存处理时的不同性能


让我们看一下从文件系统加载一张图片到内存和从一台给定的服务器加载到内存花费了多少时间。当然,这个结果取决于服务器处理请求的速度,网络的速度,服务器到测试机的距离。但是,我想要说明一个重要的概念,通过网络加载一张图片要比从文件系统中加载慢的多,从文件系统中加载要比图片本身就在内存中慢的多。我是基于加载一张50kb的图片来进行性能测试的。下面是测试的结果:


文件加载时间:0.001147

网络加载时间:4.160634


从文件系统加载图片花了1ms,而从网络加载花了4s -- 巨大的差别!1ms对于性能几乎不会产生什么影响;但是,如果需要同时加载10-20张图片,其中有些图片尺寸比较大 -- 可能超过几百 kbs。这些图片总的加载时间将会超过数秒钟。



如何确定瓶颈


从文件或网络加载有两个主要问题。

  • 在app显示图片之前用户需要等很长一段时间。这个时间会根据图片的数量而增加。如果UI在运行时需要加载很多图片,比如像UITableView,用户必须等待很长的时间,当他们想滚动查看更多信息的时候。

  • 它可能会阻塞UI,这样用户就不能和UI恰当的进行交互。第6章也会介绍到这些。


因为从文件/网络加载 data/p_w_picpaths 花的时间比从内存中加载花的时间多,而这个加载过程通常是性能的瓶颈,如果你的apps必须等待从网络返回数据,或其他必须等待的地方返回数据。所以当你遇到性能问题时,你首先要测试的就是文件或网络加载数据。像在第2章看到的,你可以使用 System Activity和File Activity观察数据加载过程。图4-1显示了UI的这些性能测试指标。

182525740.png

图4-1显示的file activities包括了加载和写文件/目录,还有读文件属性。图4-2展示了每一个activity的更多细节,能够帮助你查看哪种类型的file activities运行的比较频繁。


182936868.png


图4-3和4-4显示了更多关于System Usage的细节,它更加通用,覆盖了更多的数据类型。如图4-4,有很多plist和nib的activities。


今天暂时介绍到这里,后续敬请期待。。。