Android开发之内存优化探讨(2)空间复杂度与时间复杂度以及实际场景的选择

来源:互联网 发布:数据库架构 编辑:程序博客网 时间:2024/06/07 04:06

关于空间复杂度与时间复杂度,这个一般指的是算法。
在Android开发里面,我指的是一个app占用内存的多少与用户体验度的关系。

我们都知道空间复杂度与时间复杂度是相互矛盾的,我们所要寻求的是一个平衡而已。

举个Android开发中最为常见的例子。
当我们在一个activity里面嵌套4个fragment的时候,点击下方的四个按钮,那么4个fragment会切换这个种效果。
那么,我们一般有两个方法可以实现。

1.用repalce方法,也就是每次切换都重新加载一次fragment。
2.用hide和show,fragment只需要初始化一次,后面切换只是显示和隐藏。

我们比较常用的应该都是第二种方法,因为它免去了重复创建的过程,那么在体验上当然就会顺畅一点,因为每次初始化也就是执行oncreateview可以理解为新建了一个view,而直接显示则是直接从内存中去复用已经存在的view。
从理论上来讲,假设无效的内存立刻可以被回收,(类似C里面的手动回收,当然java里面是不可能的),第一个方法,只在需要的时候才去创建view,实际上是节约了空间,而消耗了时间,(每次都要重新绘制,当然感知上也会白屏一下)。
而方法二,则是不管是否需要,都必须将四个view保存在内存中,为了随时可以直接取出来显示。这样看来,其实方法二是牺牲了空间,而节约了时间(不用重新绘制,所以很流畅切换)。

当然,以上这个例子是建立在我们能够手动回收无效内存的理想情况下,所以两个方法各有优劣,但是实际上java的GC线程优先级是非常低的,不可能某个对象被置为NULL以后就立刻去标记它,所以在Android应用中,方法二不管从哪方面来讲都是最佳的。

最后,为了加深理解,再举个例子。
我们在Android中经常会对图片进行缓存。

1。如果每次都从网路上去加载,那么切换将是非常不流畅的(时间复杂度高),但是相对而言,总共占用的内存就是比较少的,无效的内存也可以随时回收。

2.缓存到内存中,比如我们专门给图片非配8M的缓存空间,显而易见的,空间复杂度是增加了,但是去内存中直接去图片是非常高效的,非常顺畅,时间复杂度就降低了。

那么,再结合实际情况,为图片非配8M的内存缓存,虽然空间复杂度有所增加,但是对整个系统的流程性的影响可以说是微不足道的,所以我们一般会倾向第二种方法。

当然如果想要达到某种平衡,比如说,当系统内存充足的时候正常显示,而当系统内存不足的时候,或者GC扫描到的时候,我们就将它回收掉,这种效果其实是最好的,那么就要用到弱引用或软引用了。

这个我们接下来再讲。

0 1
原创粉丝点击