给产品经理讲技术|程序设计的时空大法

图片描述

这里的“时空大法”指的是“时间换空间,空间换时间”这个程序设计中常用的“戏法”。我们经常关注的性能指标有运行的速度,占用的内存,对应的就是时间和空间。在程序性能优化的过程中,通过优化算法加快运行速度,释放不必要的资源减少内存占用,不断逼近程序可优化的极限。这种优化在初期效果明显,而越到优化的后期,提升越少,如果此时的性能指标还是不能达到期望值,这个时候就要考虑用“时空大法”了。

虽然速度和内存占用的优化都很重要,但是在应用使用的某个具体场景,速度和内存占用是有倾向性的,或许此时运行速度比较重要,或许此时内存占用比较敏感。这时使用“时空大法”来优化,往往要比直接抠时间或者直接抠空间效果要更好。

先来说说空间换时间。为了让使用者感受到应用运行的流畅,程序设计者会将经常使用的资源,或者将来很可能使用的资源加载到内存中,这个其实就是我们平常说的缓存和预读。例如用户用手机拍了一张照片,现在的手机像素比较高,一张照片一般也有4~5M,相对于手机内存来说还是很大,照完后会自动收缩为一张缩略图以便进行下次拍摄,但是是否应该将刚刚拍摄的图片释放掉呢?一般不会立即这样做,因为用户拍完照后马上查看的可能性非常高,这个时候就应该缓存一下刚拍的照片,用户回头查看的时候就能很快显示。又或是用户在阅读一本小说,虽然只需要将用户当前读的内容加载进来就能满足需要,但是在程序设计时,往往会将用户阅读当前页的前后几页都缓存到内存中,而不是翻页的时候才去加载,这样用户阅读的连贯性就有了保障。总之空间换时间的目的就是为了让使用者感到程序运行流畅。

再来说说时间换空间。时间换空间是指在空间资源有限的情况下,消耗更多的时间做加载或运算来减少内存的占用。时间换空间有好几种换法,一个是用更多的运算来代替存储,例如有一张普通的图片,我们希望给它加上一个渐变的遮罩效果,最简单的做法就是用一张带渐变效果的半透明的图片进行遮罩,但是半透明的图片实际上是非常占用内存资源的,在渐变效果有规律可循的时候,往往是在图片绘制上屏的时候,通过对每个位置的像素点进行颜色的变换达来到相同的效果,这样就省掉了遮罩图的存储空间。还有一种换法就是直接清理内存空间,例如在JAVA虚拟机环境中需要创建大量的对象,而很多对象在创建以后不再被使用,如果放任对象数量的膨胀,内存迟早用完,系统也会因为没有空间分配而无法运行,所以JAVA虚拟机会在一些特定的时间进行垃圾回收(GC),释放掉不再使用的对象,为了避免这个过程中出现混乱,GC时会让其它工作的线程停掉,等GC完了再运行,所以GC的时候会觉得应用卡卡的。虽然GC会占用一定的时间,但是它让内存处于一个一直有空间可分配的良性状态下。还有一种换法则是从外存加载到内存,你可能会说这不是空间换空间么?一般外存要比内存大的多,但是加载速度却比内存慢的多,所以从外存加载到内存会消耗更多的时间,所以也算是时间换空间。总之时间换空间的目的是为了节省存储资源。

虽然“时间换空间,空间换时间”看起来是对立的两个过程,但是二者经常是互相转化的,例如QQ的聊天记录,你可以快速翻看当前聊天附近的内容,这部分内容在内存中,上下滑动时能很快显示(空间换时间),但是当你将聊天记录滑得很远时,经常会看到“查看更多消息”这种提示,点击后需要加载一会才能显示出来,这部分内容则是从外存中加载进来的(时间换空间)。可以看到在聊天记录这个场景下“时空”的相互转换。

当然优化程序性能一上来就用“时空大法”是不对的,先将程序本身能够优化的部分先优化好,再根据具体场景使用“时空大法”才是妥妥的。

欢迎添加微信公众号:给产品经理讲技术

图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章