給產品經理講技術|程序設計的時空大法

圖片描述

這裏的“時空大法”指的是“時間換空間,空間換時間”這個程序設計中常用的“戲法”。我們經常關注的性能指標有運行的速度,佔用的內存,對應的就是時間和空間。在程序性能優化的過程中,通過優化算法加快運行速度,釋放不必要的資源減少內存佔用,不斷逼近程序可優化的極限。這種優化在初期效果明顯,而越到優化的後期,提升越少,如果此時的性能指標還是不能達到期望值,這個時候就要考慮用“時空大法”了。

雖然速度和內存佔用的優化都很重要,但是在應用使用的某個具體場景,速度和內存佔用是有傾向性的,或許此時運行速度比較重要,或許此時內存佔用比較敏感。這時使用“時空大法”來優化,往往要比直接摳時間或者直接摳空間效果要更好。

先來說說空間換時間。爲了讓使用者感受到應用運行的流暢,程序設計者會將經常使用的資源,或者將來很可能使用的資源加載到內存中,這個其實就是我們平常說的緩存和預讀。例如用戶用手機拍了一張照片,現在的手機像素比較高,一張照片一般也有4~5M,相對於手機內存來說還是很大,照完後會自動收縮爲一張縮略圖以便進行下次拍攝,但是是否應該將剛剛拍攝的圖片釋放掉呢?一般不會立即這樣做,因爲用戶拍完照後馬上查看的可能性非常高,這個時候就應該緩存一下剛拍的照片,用戶回頭查看的時候就能很快顯示。又或是用戶在閱讀一本小說,雖然只需要將用戶當前讀的內容加載進來就能滿足需要,但是在程序設計時,往往會將用戶閱讀當前頁的前後幾頁都緩存到內存中,而不是翻頁的時候纔去加載,這樣用戶閱讀的連貫性就有了保障。總之空間換時間的目的就是爲了讓使用者感到程序運行流暢。

再來說說時間換空間。時間換空間是指在空間資源有限的情況下,消耗更多的時間做加載或運算來減少內存的佔用。時間換空間有好幾種換法,一個是用更多的運算來代替存儲,例如有一張普通的圖片,我們希望給它加上一個漸變的遮罩效果,最簡單的做法就是用一張帶漸變效果的半透明的圖片進行遮罩,但是半透明的圖片實際上是非常佔用內存資源的,在漸變效果有規律可循的時候,往往是在圖片繪製上屏的時候,通過對每個位置的像素點進行顏色的變換達來到相同的效果,這樣就省掉了遮罩圖的存儲空間。還有一種換法就是直接清理內存空間,例如在JAVA虛擬機環境中需要創建大量的對象,而很多對象在創建以後不再被使用,如果放任對象數量的膨脹,內存遲早用完,系統也會因爲沒有空間分配而無法運行,所以JAVA虛擬機會在一些特定的時間進行垃圾回收(GC),釋放掉不再使用的對象,爲了避免這個過程中出現混亂,GC時會讓其它工作的線程停掉,等GC完了再運行,所以GC的時候會覺得應用卡卡的。雖然GC會佔用一定的時間,但是它讓內存處於一個一直有空間可分配的良性狀態下。還有一種換法則是從外存加載到內存,你可能會說這不是空間換空間麼?一般外存要比內存大的多,但是加載速度卻比內存慢的多,所以從外存加載到內存會消耗更多的時間,所以也算是時間換空間。總之時間換空間的目的是爲了節省存儲資源。

雖然“時間換空間,空間換時間”看起來是對立的兩個過程,但是二者經常是互相轉化的,例如QQ的聊天記錄,你可以快速翻看當前聊天附近的內容,這部分內容在內存中,上下滑動時能很快顯示(空間換時間),但是當你將聊天記錄滑得很遠時,經常會看到“查看更多消息”這種提示,點擊後需要加載一會才能顯示出來,這部分內容則是從外存中加載進來的(時間換空間)。可以看到在聊天記錄這個場景下“時空”的相互轉換。

當然優化程序性能一上來就用“時空大法”是不對的,先將程序本身能夠優化的部分先優化好,再根據具體場景使用“時空大法”纔是妥妥的。

歡迎添加微信公衆號:給產品經理講技術

圖片描述

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