精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

不改一行業務代碼,飛書 iOS 低端機啟動優化實踐

精選
運維
本文將結合飛書啟動優化,給出選取 GCD 隊列的最佳實踐,也提供針對低端機的啟動優化思路。

作者|徐霜晴

引言

在啟動優化時,我們常常通過增加并發的方式來減輕主線程的耗時。而在 iOS 中,GCD 是并發編程最常用的框架。增加并發是否是啟動優化的良策?開發者適合選用哪個優先級的 GCD 隊列?本文將結合飛書啟動優化,給出選取 GCD 隊列的最佳實踐,也提供針對低端機的啟動優化思路。

應用此思路,我們在未修改飛書業務邏輯的情況下,在飛書低端機上,取得了不錯的用戶體驗收益:首屏展示時間優化 100ms,消息列表首刷時間優化 1500ms。

低端機的特性

通過 Instruments 的 App Launch 功能,我們能看到 App 啟動時的線程狀態、Time Profiler 等信息。其中,我們發現不同設備在啟動時的表現有很大差異。??

以 iPhone 7p(低端)和 iPhone 12(高端)舉例,它們的設備參數分別為:

設備


CPU 參數

實際核數

ProcessInfo.processInfo.activeProcessorCount

跑滿的 CPU 占比(Xcode 測試)

iPhone 7p


A10 芯片[1],2 高性能 + 2 低功耗,但是只有 2 核能同時工作

2


200%


iPhone 12

A14 芯片[2],2 高性能 + 4 低功耗

6

600%


啟動飛書時,我們通過 Instruments 觀察兩個設備的線程狀態,經過統計發現,iPhone 7p 上,主線程 Preempted 和 Runnable 狀態的占比高達 21%。Instruments 的圖中能看到主線程大片被搶占。

圖片

一個典型的局部,能看到主線程是 preempted 狀態,CPU0 在執行其他進程,CPU1 在執行 GCD 線程。

而 iPhone 12,主線程 Preempted 和 Runnable 狀態占比則只占 1%從這里我們能發現:對低端機來說,CPU 已經成為了啟動的瓶頸,“增大并發”已不是一個萬能的啟動優化措施,而想辦法減少其他線程對主線程的搶占,可能會是優化思路。

GCD queue 對主線程的搶占評測

為了評估“減少其他線程對主線程的搶占”是否是一個可行的優化思路,我們首先需要弄明白,主線程被搶占的程度會有多大?

我們可以使用 Demo 制造一些極端場景,了解極端場景下,主線程有多少比例會被其他線程搶占,因此有了如下 Demo 實驗:

實驗組1:

  • 異步線程 QoS:DispatchQoS.userInteractive

代碼:

for _ in 1...100 {
let queue = DispatchQueue.init(label: "serialQueue", qos: .userInteractive)
queue.async {
while true {
}
}
}
while true {
}
  • qos_class_self 數值:33
  • 主線程 Preempted + Runnable 占比:74%

實驗組2:

異步線程 QoS:不指定 QoS 或 DispatchQoS.userInitiated

代碼:

for _ in 1...100 {
let queue = DispatchQueue.init(label: "serialQueue")
queue.async {
while true {
}
}
}
while true {
}
  • qos_class_self 數值:25
  • 主線程 Preempted + Runnable 占比:73%

實驗組3:

  • 異步線程 QoS:DispatchQoS.utility?
  • 代碼:
for _ in 1...100 {
let queue = DispatchQueue.init(label: "serialQueue", qos: .utility)
queue.async {
while true {
}
}
}
while true {
}
  • qos_class_self 數值:17
  • 主線程 Preempted + Runnable 占比:1.3%

實驗組4:

  • 異步線程 QoS:DispatchQoS.background?
  • 代碼:
for _ in 1...100 {
let queue = DispatchQueue.init(label: "serialQueue", qos: .background)
queue.async {
while true {
}
}
}
while true {
}
  • qos_class_self 數值:9
  • 主線程 Preempted + Runnable 占比:1.3%?

不指定 QoS 下,一個極端 Demo,啟動期間主線程長時間處于 preempted 狀態,一直無法得到 running 的機會

圖片

從中我們能看到幾個結論:

  1. 不指定 QoS 時,自行創建的 GCD queue 的 QoS 是 User-Initiated
  2. User-Initiated 及以上優先級,對主線程會有嚴重搶占現象;而 Utility 和 Background 則幾乎不會搶占主線程。

另外,我們也做測試驗證了,pthread_create 創建的線程,也有類似的搶占現象。

QoS 和 Priority

看到 iPhone 7p 上主線程被其他線程搶占,我們可能會有疑問:主線程不應該是優先級最高的么?怎么還會被其他線程搶占?

這里,我們需要理解一下 QoS 和線程 priority 兩個概念。

QoS(quality of service)意指服務質量,它影響線程優先級(priority),也影響 I/O 吞吐、 CPU 吞吐等指標[3]。開發者可以用 qos_class_self() 接口獲得當前線程 / 隊列的 QoS。

蘋果對于每個任務應該選用哪個 QoS,也有一些指導意見[4]:

圖片

QoS 和 priority 確實有對應關系,參考 xnu 源碼和實驗結果,對應關系為:?

QoS

Priority

User-Interactive

46,對于 UI 線程是 47

User-Initiated

37

Utility

20

Background

4

同時,線程的 priority 會隨著執行動態調整。測試中我們會發現,主線程的 priority 在運行開始時是 QoS User-Interactive 對應的 47,但隨著運行會出現下降的情況。

圖片

官方文檔[5]中解釋了線程 priority 變化的原因,priority 由 Mach scheduler 控制,為了防止計算密集的線程壟斷資源,各個線程的 priority 會實時調整。

All of these mechanisms are operating continually in the Mach scheduler. This means that threads are frequently moving up or down in priority based upon their behavior and the behavior of other threads in the system.

進一步閱讀 xnu 內核的源碼[6],我們發現,線程 priority 的變化,是由各個 Mach scheduler 實現的 compute_timeshare_priority 接口控制的。在 iOS 使用的 Mach scheduler 中,compute_timeshare_priority 為同一個實現 sched_compute_timeshare_priority。線程調度時的 priority,會在線程固有 priority 的基礎上,結合當前線程的 CPU 占用情況和當前設備的整體負載進行調整。

在這個實現中,我們能看到 Mach scheduler 對 priority 的調整會有一個極限:對于原先 priority = 47 的線程來說,向下調整的極限是 47 - ((BASEPRI_FOREGROUND - BASEPRI_DEFAULT) + 2) = 29。這和我們用多個設備測試到的結果吻合:主線程執行時,priority 的最低值是 29,依然高于 Utility 對應的 priority 20。

這也解釋了,為什么 Demo 中當異步線程的 QoS 是 Utility 時,就幾乎無法對主線程造成搶占。

優化落地

通過 Demo 實驗,一個啟動優化思路產生了:在飛書中,大量異步隊列的 QoS 是 User-Initiated,盡管這一 QoS 低于主線程的 User-Interactive,但依然可能對主線程造成搶占;那么,如果將異步隊列的 QoS 調低到 Utility,是不是就可以優先保障主線程執行,讓首屏更早展現出來?

經過一些粗暴的實驗,我們證實了飛書在這個思路上存在優化空間。但另一個問題隨之而來:如何兼顧首屏、消息列表首刷等多個指標?

考慮消息列表首刷的場景:獲取到最新的消息,不僅僅需要主線程構建 UI,還需要依賴數據庫讀取、網絡請求等異步操作。如果我們粗暴地將所有異步隊列的 QoS 調低,首屏確實能更快展現,但消息列表的首刷則隨著異步操作的變慢更劣化了。這對用戶體驗反而帶來了負向影響。

梳理出哪些異步操作是首刷依賴的,確保這些隊列的 QoS ,是優化中非常重要的一環。我們首先通過不斷用 Instruments 測試、閱讀代碼梳理出了首版白名單隊列,并在線下和線上驗證了首屏、首刷等關鍵指標的優化收益。在后來的迭代中,我們又開發了線下工具,通過在線下 hook dispatch_async 等函數,記錄下首刷等時機依賴的 GCD 隊列,達成了白名單隊列自動生成的能力。

效果分析

這一優化在線上產生了不錯的體驗優化效果:

啟動首屏展現時間優化 100ms

通過調整異步線程的 QoS,啟動期間主線程 CPU 搶占現象有明顯降低。更多計算資源集中到主線程,使得首屏展示速度明顯加快。

消息列表首刷時間優化 1500ms

通過對消息列表首刷依賴的任務的分析,我們調低了無關線程的 QoS,這也讓首刷依賴的數據庫讀取、網絡請求等任務得到了更多資源,加速了它們的執行。

總結

“增加并發”在一定范圍內可以作為啟動優化的方案,但在低端機上,CPU 已經成為瓶頸,并發時異步線程對主線程的搶占也需要引起重視。

GCD 提供了四種 QoS 給開發者使用,官方也為這四種 QoS 提供了最佳實踐建議。

經過評測和源碼推理,User-Interactive 和 User-Initiated 對主線程有明顯搶占,Utility 和 Background 對主線程的搶占極少。開發者創建的 GCD 隊列,默認的 QoS 實際為 User-Initiated。因此在啟動期間(或者任何耗時敏感期間),與啟動無直接關系的 queue,應該主動設置為 Utility 或 Background,減少對主線程的搶占。

通過飛書上落地優化,我們能得出結論:對線程或 GCD queue 調整 QoS,能在不改變啟動業務邏輯的情況下取得顯著收益。

當然,比事后優化更好的操作,是在編碼時就充分了解不同 QoS 的行為特性,選用最適合的 QoS。?

責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2024-08-16 14:28:21

2016-12-02 08:53:18

Python一行代碼

2017-11-20 14:46:27

命令代碼

2021-06-11 14:15:55

代碼前端項目

2017-04-05 11:10:23

Javascript代碼前端

2022-04-09 09:11:33

Python

2014-02-12 13:43:50

代碼并行任務

2021-12-29 09:34:49

Log4j漏洞代碼

2020-09-09 16:00:22

Linux進程

2021-11-02 16:25:41

Python代碼技巧

2020-08-19 10:30:25

代碼Python多線程

2017-04-13 19:20:18

Python代碼并行任務

2021-08-31 09:49:37

CPU執行語言

2023-09-12 10:10:57

開發者工具開源

2023-08-09 17:35:11

開源模型

2020-09-28 12:34:38

Python代碼開發

2019-12-25 14:08:50

Pandas數據計算

2020-08-12 14:54:00

Python代碼開發

2024-07-11 07:02:01

2017-01-23 21:05:00

AndroidApp啟動優化
點贊
收藏

51CTO技術棧公眾號

亚洲精品福利免费在线观看| 久久综合色8888| 久久深夜福利免费观看| 国产又黄又嫩又滑又白| 国产精品69xx| 国产清纯白嫩初高生在线观看91 | 中文在线а√在线8| 亚洲国产精品成人综合色在线婷婷| 成人免费视频97| 黄网在线观看视频| 天天射综合网视频| 日韩成人av一区| 日韩成人精品视频在线观看| 国产无遮挡裸体视频在线观看| 亚洲国产成人私人影院tom| 999精品视频一区二区三区| 亚洲第一网站在线观看| 国产精品大片| 久久激情视频免费观看| 一级性生活大片| 中文字幕中文在线| 亚洲AV无码乱码国产精品牛牛 | 欧美韩国日本一区| 古典武侠综合av第一页| 中文字幕在线视频免费| 国产欧美亚洲一区| 久久91精品国产91久久久| 毛片aaaaaa| 天天久久夜夜| 精品精品欲导航| 国产亚洲视频一区| 欧美gay视频| 黑人巨大精品欧美一区二区免费| 超级碰在线观看| 日韩毛片久久久| 久久久久久久久岛国免费| 国产精品国产一区二区| 国产xxxx在线观看| 精品综合免费视频观看| 国产精品视频大全| 日韩手机在线视频| 精品999网站| 欧美日韩123区| 久久免费美女视频| 久久久久久久久久久久久久久久av| 国产美女免费视频| 九九视频精品免费| 国产在线精品播放| 97超碰资源站| 麻豆免费看一区二区三区| 国产激情综合五月久久| youjizz在线视频| 国产日韩一区| 欧美亚洲日本网站| 好吊色在线视频| 美女91精品| 日本高清不卡在线| 超碰在线免费97| 日韩电影免费一区| 国产精品香蕉av| 一本色道久久综合熟妇| 久久99热狠狠色一区二区| 国产在线精品一区免费香蕉| 国产精品久久久久久69| 激情综合一区二区三区| 日韩影院免费视频| 欧美性69xxxx肥| 色欲av无码一区二区人妻| 亚洲天堂av影院| 色天使色偷偷av一区二区| 日韩a在线播放| 国产综合av| 欧美喷水一区二区| 91福利视频免费观看| 国产精品传媒| 亚洲欧美日韩在线一区| avhd101老司机| 亚洲精品国产成人影院| 久久久欧美一区二区| 天天综合天天干| 日本aⅴ免费视频一区二区三区| 国产精品久久久久久久久影视 | 精品视频全国免费看| 中文字幕精品一区二区三区在线| 日韩中文字幕无砖| 亚洲精品久久久久久久久久久 | 一区二区三区四区在线免费观看 | porn亚洲| 亚洲另类在线视频| 欧美 日本 亚洲| 日韩色淫视频| 欧美va在线播放| 亚洲狠狠婷婷综合久久久久图片| 成人免费电影网址| 欧美激情xxxx| av首页在线观看| 国产iv一区二区三区| 欧美日韩国产精品一区二区| 欧美精品hd| 天天爽夜夜爽夜夜爽精品视频| 国产免费999| 66精品视频在线观看| 国产亚洲精品一区二555| 青青操国产视频| 肉肉av福利一精品导航| 91免费精品视频| 青青草视频免费在线观看| 亚洲欧美日韩一区二区| 日本三级免费观看| 日本精品一区二区三区在线观看视频| 欧美xxxx少妇| 亚洲女同一区二区| 国产精品69页| 国产精品国产| 久久久91精品国产一区不卡| 亚洲第一在线播放| 国产精品一区二区三区网站| 奇米视频888战线精品播放| 欧美黑人xx片| 欧美精品1区2区3区| 欧美做受xxxxxⅹ性视频| 亚洲性色视频| 亚洲xxxxx性| 在线看免费av| 91福利视频在线| 日韩片在线观看| 综合天堂久久久久久久| 国产v综合v亚洲欧美久久| 亚洲欧美国产高清va在线播放| 国产精品美日韩| 国产福利视频在线播放| 久久久久97| 欧美日韩国产成人在线观看| 国产美女无遮挡永久免费| 日本一区二区成人| 亚洲成a人在线观看| 九一免费在线观看| 91精品亚洲一区在线观看| 亚洲一区二区国产| 中文字幕精品视频在线观看| 91亚洲资源网| 黄色一级片播放| 久久中文字幕导航| 午夜精品一区二区三区在线播放| 亚洲不卡免费视频| 亚洲精品成人悠悠色影视| www.污污视频| 91精品国产自产拍在线观看蜜| 国产男人精品视频| 日本三级在线播放完整版| 欧美日韩在线观看一区二区| 91ts人妖另类精品系列| 免费一级片91| 成人手机视频在线| 国产一区二区三区视频在线| www.欧美精品| 国产日韩免费视频| 一区二区视频在线看| 亚洲少妇一区二区三区| 亚洲小说欧美另类社区| 久久99精品国产99久久| 污污网站免费观看| 狠狠狠综合7777久夜色撩人 | www欧美在线| 91麻豆国产精品久久| 国内外成人免费激情视频| 久久99高清| 国产精品一区二区三区在线播放| 日本中文字幕电影在线免费观看 | 亚洲一区在线观看视频| 免费不卡的av| 国产精品久久久久久久免费软件| 蜜桃久久影院| 黑人一区二区三区| 久久国产精品99国产精| 秋霞欧美在线观看| 色呦呦国产精品| 黄大色黄女片18免费| 狠狠狠色丁香婷婷综合久久五月| 日本一级黄视频| 秋霞在线一区| 国产日韩换脸av一区在线观看| 国产成人l区| 亚洲国产精品久久久久| 人妻 日韩精品 中文字幕| 国产影视精品一区二区三区| 一区二区三区四区视频精品免费| 九九热精品在线播放| 欧美69wwwcom| 欧美一级爽aaaaa大片| 99久久久国产| 欧美一区视频在线| 日本美女在线中文版| 精品第一国产综合精品aⅴ| www五月天com| 亚洲综合免费观看高清完整版 | 亚洲免费成人网| 一本大道久久a久久综合婷婷| 成人信息集中地| av电影在线观看一区| 亚洲综合激情视频| 六月丁香综合| 少妇大叫太大太粗太爽了a片小说| 九九热精品视频在线观看| 51国偷自产一区二区三区的来源| 自拍在线观看| 久久国产精品亚洲| 韩国三级av在线免费观看| 欧美成人欧美edvon| 中文字幕人妻一区二区在线视频| 四虎4545www国产精品| 亚洲国产精品人人做人人爽| 国产sm调教视频| 成人国产一区二区三区精品| 日日干夜夜操s8| 免费视频一区| 日本中文字幕亚洲| 亚洲深深色噜噜狠狠爱网站| 日韩亚洲欧美精品| 美女视频亚洲色图| 成人av免费在线看| 久久av日韩| 国产精品久久久久久久久久免费| heyzo高清在线| 欧美成人性色生活仑片| 成人网视频在线观看| 亚洲精品一区久久久久久| 亚洲国产精品二区| 91精品国产欧美一区二区18| 中文字幕在线播放av| 一本大道综合伊人精品热热 | av电影成人| 少妇高潮一区二区三区99| 国产精品久久久91| 桃色一区二区| 日韩免费精品视频| 色偷偷色偷偷色偷偷在线视频| 久久亚洲精品小早川怜子| 国产一区不卡在线观看| 日韩一级淫片| 91手机在线观看| 日韩精品一区二区三区中文在线 | 久久久久久久久99精品| 中文字幕高清视频| 91蜜桃传媒精品久久久一区二区| 大桥未久恸哭の女教师| 成人性色生活片免费看爆迷你毛片| gogo亚洲国模私拍人体| 国产成人精品亚洲午夜麻豆| 又黄又爽又色的视频| 国产精品羞羞答答xxdd| av电影中文字幕| 国产91色综合久久免费分享| 欧美午夜精品一区二区| 成人短视频下载| 中文字幕av观看| 国产午夜亚洲精品午夜鲁丝片| 加勒比综合在线| 国产精品天天看| 国产a免费视频| 亚洲宅男天堂在线观看无病毒| 国产无精乱码一区二区三区| 精品成人乱色一区二区| 国产免费av一区| 欧美三级欧美一级| 国产三级午夜理伦三级| 久久69成人| 欧美黑人一区二区三区| av日韩国产| 欧美一区第一页| 777午夜精品电影免费看| 成人精品一区二区三区| 无人区乱码一区二区三区| 九色综合日本| 色综合久久网| 国产 国语对白 露脸| 亚洲激情专区| 亚洲成色www.777999| 国产做a爰片久久毛片| 亚洲成a人无码| 久久色中文字幕| 亚洲色偷偷综合亚洲av伊人| 亚洲午夜国产一区99re久久| 亚洲 欧美 成人| 56国语精品自产拍在线观看| 人妻丰满熟妇av无码区hd| 亚洲无亚洲人成网站77777| 日韩黄色影院| 97在线观看视频国产| 成人在线高清| 国产精品视频免费一区二区三区 | 日韩aaaa| 91.com在线| 日韩电影免费一区| 欧美图片自拍偷拍| 日本一区二区三区视频视频| 免费一级黄色大片| 欧美性做爰猛烈叫床潮| 蜜桃在线一区二区| 精品国产美女在线| 小草在线视频免费播放| 91成人理论电影| 欧美亚洲国产激情| 国产精品久久中文字幕| 国产在线不卡一区| 精品国产成人亚洲午夜福利| 亚洲国产另类精品专区| 中文字幕一区二区三区四区视频| 亚洲高清久久久久久| 黄页视频在线播放| 日本一区二区在线播放| 在这里有精品| 伊人久久大香线蕉精品| 老牛国产精品一区的观看方式| 男人女人拔萝卜视频| 国产精品久久三区| 久久久精品福利| 亚洲国产成人一区| а天堂中文在线官网| 国产精品久久久久久五月尺| 天天久久夜夜| 久久综合色视频| 国产福利91精品一区二区三区| 免费成人美女女在线观看| 色综合久久中文综合久久97| 69亚洲精品久久久蜜桃小说 | 欧美伊人久久大香线蕉综合69| 五月婷婷六月激情| 国内精品久久久久久中文字幕| 99久热在线精品视频观看| 亚洲偷熟乱区亚洲香蕉av| 国产亚洲精品女人久久久久久| 欧美日韩一区二区三区四区| 黄色免费在线播放| 日本成人激情视频| 亚欧日韩另类中文欧美| 欧美 日韩 亚洲 一区| 成人免费黄色在线| 久一视频在线观看| 精品国产网站在线观看| 免费在线看电影| 国产精品theporn88| 国产精品激情| 美女伦理水蜜桃4| 亚洲成人av福利| 天天摸夜夜添狠狠添婷婷| 国模精品系列视频| 牛牛影视久久网| 日韩欧美一区二| www国产亚洲精品久久麻豆| 国产免费观看av| 亚洲人精品午夜在线观看| 先锋欧美三级| 亚洲三区视频| 国产在线精品视频| 国产一区二区三区在线视频观看| 欧美一卡二卡在线观看| 性欧美猛交videos| 国产精品日韩一区二区三区| 国产精品一页| 久久久视频6r| 欧美精品日韩精品| 中文字幕有码在线观看| 99影视tv| 亚洲男女自偷自拍| 国产精品麻豆免费版现看视频| 欧美片网站yy| 91超碰在线播放| 日本精品一区二区三区不卡无字幕| 午夜av免费在线观看| 欧美日韩aaaaaa| sm国产在线调教视频| 国产欧美韩日| 天堂一区二区在线| 熟女少妇a性色生活片毛片| 日韩欧美精品在线视频| 天堂√8在线中文| 亚洲一卡二卡区| 高清不卡一二三区| 无码无套少妇毛多18pxxxx| 久久精品国产欧美亚洲人人爽| 911精品国产| 亚洲免费av一区二区三区| 亚洲精品亚洲人成人网| 天堂中文资源在线| 国产日韩av在线| 中日韩男男gay无套| 九一在线免费观看| 亚洲国产美女精品久久久久∴| 日韩欧美2区| 国产成人永久免费视频| 日本一区二区三级电影在线观看 | 久久99久久久久久| 久久精品人人做人人爽人人| 国产精品久久久久久免费| 国产69精品久久久久久| 五月久久久综合一区二区小说| 欧美在线一级片| 91精品国产一区二区三区蜜臀 | 欧美在线啊v一区|