感嘆在開發(fā)中冥思苦想后靈光一現(xiàn)的那些思路

前言

我覺得開發(fā)技術(shù)的提升不僅僅是知識含量的增加,更重要的是開闊自己的思路椰憋,在解決同樣的問題時方案能夠更勝一籌到忽,讓程序能夠更有效率布讹,更優(yōu)雅率挣。這些思路往往都是在冥思苦想后的靈光一現(xiàn)刻伊。下面我舉幾個例子,包括 JSPatch 的方法調(diào)用思路椒功,微信讀書如何處理數(shù)據(jù)層卡頓捶箱,微信終端跨平臺組件 mars 里日志模塊 xlog 的性能優(yōu)化方案,以及自己在 SMCheckProject 項目中對使用方法的解析思路动漾。

JSPatch中的方法調(diào)用

JSPatch作者 bang《JSPatch實現(xiàn)原理詳解》 這篇博客中提到方法調(diào)用的實現(xiàn)比如 UIView.alloc() 在開始時為了能夠讓這個方法調(diào)用丁屎,需要給 UIView 對象添加 alloc 方法。由于 JS 沒有 OC 那樣的轉(zhuǎn)發(fā)機制旱眯,所以 bang 開始的時候采用了一個復(fù)雜的方式晨川,在 require 生成類對象時通過類名用 Runtime 的方法找出此類所有方法,然后 JS 為每個方法生成一個函數(shù)键思,這樣的函數(shù)用方法名去 OC 調(diào)用對應(yīng)的方法。

這樣的想法可行甫贯,但是效率性能難以接受吼鳞,消耗的增長是指數(shù)級的。因為不光是當(dāng)前的類需要遍歷叫搁,父類直到頂層都需要赔桌,會出現(xiàn)內(nèi)存消耗過度的問題。后來 bang 苦苦找解決方案渴逻,突然腦洞大開疾党,想到如果能夠?qū)崿F(xiàn)調(diào)用一個不存在的方法能夠轉(zhuǎn)發(fā)到一個指定函數(shù)執(zhí)行就好了,于是把 JS 里方法調(diào)用都替換掉改成調(diào)用 __c() 函數(shù)惨奕,把相關(guān)信息傳給 OC 雪位,OC 再用 Runtime 來調(diào)用相應(yīng)的方法返回結(jié)果。這樣做不用遍歷梨撞,不用保存方法雹洗,我覺得這種腦洞大開想到的方案的這種思路是非常值得學(xué)習(xí),當(dāng)一種思路越陷越深時卧波,要時刻提醒自己时肿,跳出來再看看,是不是還有其它的路可以走港粱。

微信讀書處理數(shù)據(jù)層卡頓

WeRead團隊博客里有篇文章 《微信讀書 iOS 質(zhì)量保證及性能監(jiān)控》 介紹了他們對數(shù)據(jù)層的性能監(jiān)控螃成。他們數(shù)據(jù)層使用的是 YDataCenter,在這個數(shù)據(jù)層框架里一次 SQL 的完整操作要經(jīng)過等待 cache 隊列,放入 cache 隊列執(zhí)行寸宏,等待 db 隊列宁炫,放入 db 隊列四個步驟。將這四個步驟的時間和對應(yīng) SQL 記錄下來击吱,因為這樣的 SQL 操作較多淋淀,所以只將超過指定時間的記錄下來,這樣能以最小的代價找出那些造成阻塞卡頓的 SQL 和場景出來進行優(yōu)化覆醇。

日志文件寫磁盤導(dǎo)致大量IO引起程序卡頓

微信團隊在介紹他們微信終端跨平臺組件 mars 里的日志模塊時提到了他們對日志寫磁盤處理的考慮過程朵纷。一般的簡單的處理都會采取兩次數(shù)據(jù)拷貝實現(xiàn)寫入磁盤,第一次是從用戶空間內(nèi)存拷貝到內(nèi)核空間的緩存永脓,第二次是回寫內(nèi)核空間的緩存到磁盤袍辞。但是頻繁的空間切換使得應(yīng)用層的性能不可控。

一般為了解決空間切換都會采用先將日志緩存到內(nèi)存中常摧,達到設(shè)置的大小后再壓縮加密寫入文件搅吁,但是這個方案的壓縮還是會有讓 cpu 飆升的可能,還有個很嚴(yán)重的丟日志的問題落午。如何能夠完美處理呢谎懦。

mars 的日志模塊 xlog 最終采用了 mmap 這種內(nèi)存映射文件的方法來作為一個既能夠有直接寫內(nèi)存的性能,又具有直接寫文件可靠性的方案溃斋。從測試來看寫內(nèi)存和寫 mmap 的耗時幾乎是一樣的界拦。

SMCheckProject項目中對使用過的方法的解析

SMCheckProject 這個項目有需要解析出所有使用過的方法,一開始會想到使用遞歸梗劫,以前我做 STMAssembleView 中對自定義的 DSL 語言解析時就是使用的遞歸享甸,這樣時間復(fù)雜度就會是 O(nlogn) ,這次我換了個思路梳侨,將復(fù)雜度降低到了 n 蛉威,思路大概是 創(chuàng)建一個字典,鍵值就是深度走哺,模擬語法樹結(jié)構(gòu)蚯嫌,從左到右深度的增加根據(jù) [ 符號,減少根據(jù) ] 符號丙躏,值會在 [ 時創(chuàng)建一個 Method 結(jié)構(gòu)體齐帚,根據(jù) ] 來完成結(jié)構(gòu)體,將其添加到 methods 數(shù)組中 彼哼。 這種優(yōu)化在項目小文件少時看不出很大的區(qū)別对妄,但是在項目規(guī)模非常龐大時卻能將總時間省掉不少。

靈光一現(xiàn)后需要付出的努力

當(dāng)然光是有個好的思路和想法是完全不夠的敢朱,為了能夠?qū)崿F(xiàn)思路也是八方英雄各顯神通剪菱。從有了利用編譯原理中分析語法轉(zhuǎn)換語法這個思路進行動態(tài)化開始摩瞎,逐步演化到開發(fā)一套全自動編譯器實現(xiàn)OC源碼轉(zhuǎn)字節(jié)碼后通過自建虛擬機與Native運行時互聯(lián)。下面我列出些相關(guān)的文章孝常,可以看到大量的基礎(chǔ)知識積累是這些好的思路必備的基礎(chǔ)旗们,光是有著靈活的大腦也是不夠的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末上渴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喜颁,更是在濱河造成了極大的恐慌稠氮,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件半开,死亡現(xiàn)場離奇詭異隔披,居然都是意外死亡,警方通過查閱死者的電腦和手機寂拆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門奢米,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纠永,你說我怎么就攤上這事鬓长。” “怎么了尝江?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵涉波,是天一觀的道長。 經(jīng)常有香客問我茂装,道長怠蹂,這世上最難降的妖魔是什么善延? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任少态,我火速辦了婚禮,結(jié)果婚禮上易遣,老公的妹妹穿的比我還像新娘彼妻。我一直安慰自己,他們只是感情好豆茫,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布侨歉。 她就那樣靜靜地躺著,像睡著了一般揩魂。 火紅的嫁衣襯著肌膚如雪幽邓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天火脉,我揣著相機與錄音牵舵,去河邊找鬼柒啤。 笑死,一個胖子當(dāng)著我的面吹牛畸颅,可吹牛的內(nèi)容都是我干的担巩。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼没炒,長吁一口氣:“原來是場噩夢啊……” “哼涛癌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起送火,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤拳话,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漾脂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體假颇,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年骨稿,在試婚紗的時候發(fā)現(xiàn)自己被綠了笨鸡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡坦冠,死狀恐怖形耗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辙浑,我是刑警寧澤激涤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站判呕,受9級特大地震影響倦踢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侠草,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一辱挥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧边涕,春花似錦晤碘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至式撼,卻和暖如春童社,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背著隆。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工扰楼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甘改,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓灭抑,卻偏偏與公主長得像十艾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腾节,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 劉未鵬和李笑來都建議寫東西越早越好. 所以就記錄點隨筆, 以后覺得能對別人有大點的用處, 就不斷的改版...老師們...
    Justin_Zhai閱讀 338評論 0 0
  • 紅豆一生中孤獨的人忘嫉, 每天早出晚歸, 為了三餐案腺, 為了生活庆冕, 對著各種人與事, 心談了劈榨。 當(dāng)某天访递,紅豆在公車上遇見...
    紅豆遇見抹茶閱讀 505評論 1 3
  • 未經(jīng)體驗的情緒是不好說自己可以控制的。就像沒當(dāng)過尚說和尚不過就是個吃素的一般膽大無腦同辣。 今天的雨和之前的雨沒有不同...
    君子包閱讀 345評論 1 4