啟動要快、記憶體要穩、火候不能抖:一篇效能手冊,其實是一本食譜
一篇Android效能優化手冊在工程圈流傳,我們把啟動、記憶體與卡頓這三件事,翻譯成廚房裡開火、備料與火候的滋味故事。
九月十四日,技術社羣掘金上出現了一篇長文,標題很硬,叫「Android性能優化:啟動、內存、卡頓的一站式排查手冊」。工程師們轉來轉去,討論的是冷啟動怎麼壓進一秒、記憶體為什麼漏、卡頓的元兇藏在哪一行程式碼。這些詞離廚房很遠,但你若在爐子前站過幾年,會發現作者寫的其實是一本食譜:開火的時機、備料的順序、火候的穩定。一桌好菜的麻煩,跟一支好用的App,骨子裡是同一件事。
啟動,就是從點火到第一盤菜上桌
手冊裡說,冷啟動是用戶對App的第一印象,中階機一秒內要看到首屏,低階機一秒半。超過兩秒,商店還會給你警告。翻成餐桌的話:客人坐下到第一道菜端上來,超過某個時間,他就開始看手機了。
作者的第一板斧,是「Application裡不要做重活」。很多團隊在程式一開始就塞十幾項初始化,實測下來,低階機光這一段就要花六百到九百毫秒。這像什麼?像你一進廚房就把所有鍋子燒熱、所有材料切好、十罐調味料全開蓋,結果客人只點了一碗湯麵。手冊給的解法是延遲初始化,用到的時候再做,有些東西甚至等真的出事了再準備也來得及。
廚房裡的老師傅都懂這個。煮一碗牛肉麵,牛骨高湯要提前一天吊,但蔥花等到起鍋前再切,切早了就蔫。哪些事必須先做、哪些事臨場再做,這份判斷,就是所謂的「啟動優化」。家裡的飯桌之所以六點半能開飯,靠的從來不是手快,是順序對。
這也讓人想起我們之前寫過的廚房裡備料與那一鍋湯的滋味故事,面試官問的一串問題,答案其實早就燉在家裡的爐子上。
記憶體,是冰箱與流理臺的關係
手冊的第二章講記憶體。作者提到一個常見的迷信:加個快取就夠了。他說,快取救不了真正的洩漏。洩漏的意思是,有些東西你以為用完了、放掉了,其實一直佔著位置,佔到後來整個系統喘不過氣。
廚房裡最懂這件事的人,是負責洗碗的那位。鍋碗瓢盆用完不洗、不歸位,流理臺越堆越滿,最後連切一顆蔥的地方都沒有。這跟記憶體洩漏一模一樣:空間沒有變小,是被沒歸位的東西喫掉了。快取像冰箱,把暫時不用的東西冰起來,方便下次拿。但冰箱不是萬靈丹,你若把過期三週的湯一直冰著,冰箱再大也會滿,而且滿得讓人不敢開門。
家裡的廚房要順,靠的是固定的整理節奏:煮完就擦、喫完就洗、每週清一次冰箱。手冊裡講的記憶體管理,說穿了也就是這句話,東西用完要還,位置要空出來,下一道菜才有地方做。
卡頓,是火候抖了的那一瞬間
第三章最有味道。作者說,很多人看到監測工具裡的紅線就慌,急著優化。他的提醒很冷靜:那條紅線很多App都有,未必是真正的瓶頸。真正的卡頓,要找出元兇,看到底是哪一段、哪一行拖慢了整體。
這是炒菜的人都經歷過的時刻。一盤炒青菜端上桌,客人說:「今天的菜怎麼老了?」新手會怪油不夠、怪鍋不好、怪菜不新鮮。老手會回頭想:是不是下鍋前菜葉上的水沒瀝乾,讓鍋溫掉了五度?是不是火開得夠大,但翻炒慢了那麼三秒?卡頓就像青菜變老,問題往往不在最顯眼的地方,而在某個你沒注意的瞬間。紅線就像客人皺的眉頭,它告訴你有事不對,卻不會告訴你在哪裡。找元兇的過程,得一段一段回放,像重看自己做菜的錄影。
這種「改一處、馬上看到差別」的經驗,我們在改一味不用重燉整鍋的回鍋快熱故事裡也聊過,小地方的調整,往往比整鍋重來更見功力。
手冊的最後一頁,寫的是耐心
作者還提了Baseline Profile這類預編譯機制,讓關鍵路徑提前暖好,中低階機冷啟動能快兩到四成。這簡直就是前一晚把肉醃好、把飯浸好的道理。開飯前那一分鐘的從容,都是前一晚冰箱裡的安靜工作換來的。
一篇講手機效能的技術長文,讀到後來會發現,它真正在講的是資源的分配與時間的順序。而這兩件事,每一張家庭餐桌每天都在練習。媽媽知道電鍋跳起來後要再燜十分鐘,爸爸知道煎魚下鍋後三分鐘內不能動它。這些數字沒寫在任何手冊上,卻精準得像量測出來的。
今晚你若在廚房,不妨觀察一下自己的「啟動流程」:進廚房後第一件事做什麼、哪些料先下、火何時轉小。也許你會發現,自家的開飯時間,早就有屬於自己的最佳化手冊了。而那本手冊的名字,通常叫做「經驗」。