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

抖音 Swift 編譯優化 - 基于自定義 Toolchain 編譯提速 60%

移動開發
本文重點探討全部模塊化后帶來的依賴解析瓶頸,主要包括對頭文件增量編譯分析等內容。

優化方案基于 Swift Toolchain 源碼,本文不再探討 Toolchain 相關基本概念及配置流程等,僅聚焦方案本身。?

背景

隨著混編落地的業務場景越來越多,越來越大,開發中出現的性能痛點開始顯現,問題很明顯集中在被 Swift 環境所依賴的 OC 倉的頭文件改動上。因此基建架構把重點放在接口層依賴的性能分析上,力求解決性能瓶頸。

抖音基礎技術團隊借助自定義 Toolchain 能力,通過自定義編譯參數,裁剪 Clang Header 指定內容,最終實現編譯提速 60% 。

本方案已于 2022 年 11 月底上線,在抖音穩定運行近 5 個月。下面就讓我們一起回顧下整個方案從提出到落地的全過程。

初步分析

在混編場景下,若要確保 OC 與 Swift 間盡可能充分地互操作,則模塊化的啟用無法僅用在 Swift 編譯上下文中——Swift編譯導出的 Clang Header,在工程中以??$(project_name)-Swift.h??形式出現,將其需要被 re-export 引用的 OC 依賴項,以模塊的形式導出,這就意味著若 OC 編譯不啟用模塊化,則無法正確使用 Swift 提供的頭文件。

圖片

如圖,二者不可兼得,Objc Pod D 為了能夠解析語句??@import A;??而引入??A.modulemap??,則其與 A 的互操作不可能再基于文本導入的邏輯,而全面轉向模塊化。

對于抖音而言,巨型 OC 項目的大量頭文件傳遞依賴的歷史包袱,使得在 OC 編譯中引入模塊化是一場災難。模塊化環境下,緩存系統決議是否要命中 .o 緩存的耗時,比文本環境下重新編譯耗時還要長;增量編譯時,也會導致廣泛的模塊重編,改動一個頭文件,就要等待數分鐘。

傳遞依賴治理是一項長期工程,但編譯優化等不了那么久,我們需要一個可以快速解決的方案。

優化效果

在介紹方案之前,先上結論。

在抖音工程中選取代碼量最大的 OC&Swift 混編倉庫進行測試:

  • OC 增量編譯:選取被 Swift 依賴的 OC 接口層頭文件進行改動,編譯耗時降低 60%
  • Swift 增量編譯:選取被 OC 依賴的 Swift public class 進行改動,編譯耗時相近,無變化
  • 全量編譯:清除本地編譯緩存進行 clean build,編譯耗時降低 17%

可見該方案對編譯速度的巨大提升。接下來就讓我們回顧一下整個方案從預研到上線的過程。

方案原理

解決問題的關鍵在于降低將 OC 頭文件預編譯耗時,這里有兩個思路:

  • 長期:模塊解析的耗時根源在于傳遞依賴,模塊的特性導致不同模塊內包含的頭文件的傳遞依賴會將模塊增量重編的影響范圍擴展到很大。業務庫在現有工程架構體系下已經嚴格控制了接口層傳遞依賴,因此長期方案會逐步推動治理基礎庫的傳遞依賴問題。
  • 短期:將 OC 頭文件預編譯轉回文本導入,即裁剪-fmodule-map-files注入,但依然保留對 OC 調用 Swift 代碼的支持

圖片

Swift會將自身接口層(即 public/open )聲明使用到的 C/OC 模塊,在??xxx-Swift.h??中以??@import aaa??形式給出,這就要求 OC 側使用該頭文件時也需要將這些模塊對 OC 側可見,我們想要達成目的,就需要對這些聲明進行裁剪。這需要自定義工具鏈的支持。

本次優化方案效果測試針對的是短期方案。

通過修改編譯器,對 Swift 編譯生成的 Clang Header Interface 進行裁剪,刪除掉系統庫以外的 @import,而 OC 側引用該頭文件的地方手動補全依賴。即以暫時犧牲接口self-contained為代價,使OC側不必再關心模塊相關的因素。為支持更細粒度的控制,通過向編譯器注入編譯參數,以針對不同組件控制此功能的啟用,以及實現更具體的裁剪內容。

而對于??-fmodule-map-files??的裁剪相對容易,只需修改??OTHER_CFLAGS??即可關閉??-fmodule-map-files??的注入。

預研

方案拆解

我們先來對整個方案做一個任務拆解,可以分析出各部分的依賴關系,節省預研階段的耗時。

一個工具鏈相關的落地方案,必須保證其穩定性,因此一定是可以通過一種簡單的方式進行外部控制開關的。

從發版角度講,工具鏈發版并不像業務代碼,和存放在開發倉庫的配置一樣可以靈活發版,因此應盡可能保證工具鏈代碼的穩定,非必要不修改。

基于這兩個原則,我們可以拆解為:

1.分析 ??swiftc?? 的參數解析機制,在編譯時的參數列表中拼接新的自定義參數以控制裁剪能力。??swiftc?? 是實際的前端 ??swift-frontend?? 的一個入口,下面會詳細提到,向 swiftc 注入的參數列表,在各 ??swift-frontend?? 子任務中并不總是以相同的全集出現,作用機制需要進一步分析。

2.基于細粒度控制的考量,參數選擇傳入一個配置文件,包含一個白名單,來確定哪些??@import Module??是可以留下的。我們也有考慮過黑名單,但實際工程的依賴情況是復雜的,不論是 Cocoapods 還是 seer ,都僅能描述工程層面的依賴情況,而不能保證實際編譯時的依賴情況,難以構建一個全面的業務黑名單。而系統庫白名單是相對固定的,并不需要經常維護。

3.尋找生成 -Swift.h 的具體函數,以及寫入??@import Module;??的邏輯以進行裁剪。

4.在寫入邏輯處加載白名單文件并進行過濾。

5.通過本地驗證,完成無感知下發 Toolchain 的驗證,打出測試 Toolchain 。

6.灰度驗證。

7.合碼發版上線。

快速驗證

想要驗證方向是否正確,同時給予飽受編譯耗時困擾的業務同學以信心,需要先找到最關鍵的點快速驗證。

因此我們決定先直接整體關掉所有 -Swift.h 的??@import Module;??生成邏輯。此時我們對整體 Swift 源碼的認知還較為模糊,但我們只需要去尋找類似??<< "@import"??或其他寫文件的邏輯再去篩選即可,所幸這一過程沒有花費太久。

圖片

我們很快找到了這塊邏輯,并直接將??out << "@import " << Name.str() << ";\n";??注釋掉,打包驗證成功,出具了本文開頭的數據報告,給業務同學吃下一顆定心丸。

接下來,我們就可以穩健地按部就班地去執行其他任務了。

開發、調試

swift-frontend 參數解析流程

于是我們將目光轉向了其他在前端層級應用的原生參數,并參考它們的寫法。很快我們將目光鎖定在??module-cache-path??,這是一個 Swift 前端編譯必需的參數,指定模塊緩存位置,且后面傳入一個路徑,完全符合我們的要求。

根據對該參數的分析,可得 -frontend 階段的參數解析流程,具體調研過程不再展開,直接簡單過下流程。

圖片

簡單流程如上圖,下面具體過下修改參數解析流程的代碼位置。

定義

圖片

此處使用了一種十分類似 python 的,LLVM 推出的 TableGen (https://llvm.org/docs/TableGen/)語言,后面這些 flag ,我們需要的是

  • FrontendOption 前端參數,擁有這個flag才會進入前端參數解析流程,而 Clang Header 生成的過程就發生在前端流程中
  • ArgumentIsPath 參數為路徑,告知編譯器該參數后攜帶路徑字符串作為參數

仿照這種形式的自定義參數:

圖片

第二個 EQ 定義其實是一種 Alias,定義了可以使用" flag=arg "這種形式來進行傳參,沒有其他額外作用。

通過??tablegen??工具,把 Options.td 的內容生成為 Options.inc ,如下圖

圖片

結合 Swift 源碼中 Options.h 的 OPTION 定義,引入并提供給 cpp 代碼使用

圖片

解析

解析過程發生在 CompilerInvOCation 的參數解析流程中

圖片

在 ArgsToFrontendOptionsConverter 方法中,從參數列表讀取需要的信息,賦值到 Opts 當中

圖片

Opts 是一個 FrontOptions 類型的實例,我們需要在這里定義一個字符串以存儲我們需要的參數

圖片

Opts 會在整個前端流程中流轉,為各環節提供必要參數。

Clang Header 生成流程

調用過程的流程圖如下,PrintAsClang 是一個相對獨立的模塊,我們改動只需要關注這兩個標紅環節即可。

圖片

增加入參定義

在原方法定義上加入兩個傳參,分別是我們傳入的白名單文件路徑,以及診斷信息,診斷信息后面會提到,用于提示一些自定義錯誤。

圖片

這里也是相同,增加兩個參數定義。

圖片

白名單解析

printAsClangHeader 這里是我們的主要修改之一,在這個 function_ref 當中,我們對 allow list path 指向的文件進行了內容解析,得到白名單指定的模塊名稱,以參數形式傳遞給下一個環節。

圖片

writeImports 方法在原有基礎上增加一個 function_ref,可以理解為 ??lambda?? 表達式,就是我們剛剛做的白名單解析的過程。

圖片

在具體寫入??@import Module;??處進行白名單篩選,在白名單內部的允許寫入,否則跳過。

圖片

自定義診斷信息

DiagnosticsClangImporter.def 中加入兩個自定義條目,error 用于提示解析錯誤,note 僅提示白名單為空,為空是允許的操作,此時退化為默認邏輯。

圖片

前面我們在方法定義中傳入了 Diags 實例,想要提示信息,只需簡單調用即可,note 只會輸出到日志,error 則會打斷編譯流程。

圖片

驗證、上線

可使用云構建機器打出測試 Toolchain,下載至本地,集成到 Xcode 中在抖音驗證即可。

將自定義參數加入到指定混編組件的編譯參數當中,即可成功構建。

后記

Swift 工具鏈定制是一個擁有無限可能的方向,包括編譯優化這類效率提升的工作等等,都可以在底層進行傳統意義上的架構層所難以進行的深度優化,后續針對這塊可做的事還有很多,相信有更多的經驗可以分享給到大家。

責任編輯:龐桂玉 來源: 字節跳動技術團隊
相關推薦

2022-06-06 12:19:08

抖音功耗優化Android 應用

2022-06-01 09:18:37

抖音ReDex算法優化

2025-07-30 09:36:47

2024-06-13 17:10:16

2022-07-19 16:47:53

Android抖音

2022-03-29 13:27:22

Android優化APP

2025-10-27 02:11:00

2021-07-01 11:07:49

Swift 自定義操作符

2022-07-06 13:02:00

高延時電商直播主播互動

2025-05-15 07:11:51

2011-09-09 14:39:43

S60 Webkit

2023-11-03 17:02:18

抖音直播畫質優化

2023-07-31 07:33:04

Rust編譯器內存

2015-02-12 15:33:43

微信SDK

2022-04-28 15:07:41

抖音內存泄漏Android

2011-09-09 15:08:17

S60 WebKit

2023-03-03 15:43:23

抖音世界杯畫質優化

2021-06-08 09:00:42

Swift 協議LLDB 命令

2015-02-12 15:38:26

微信SDK

2009-07-06 13:49:29

點贊
收藏

51CTO技術棧公眾號

秋霞网一区二区| 五月天色婷婷综合| 久草视频免费在线播放| 久久久久伊人| 亚洲人成网站影音先锋播放| 91在线中文字幕| 丁香花五月激情| 精品久久ai电影| 色婷婷久久久亚洲一区二区三区| 日韩电影免费观看在| 依依成人在线视频| 亚洲成av人电影| 欧美精品一区二| 狠狠热免费视频| 黄网站免费在线观看| 国产一区二区在线看| 国产+成+人+亚洲欧洲| 美国黄色a级片| 久久精品 人人爱| 亚洲精品国产第一综合99久久| 不卡日韩av| 国产精品久免费的黄网站| 久久国产亚洲精品| 欧美喷潮久久久xxxxx| 国产精品va在线观看无码| 色播色播色播色播色播在线| 日本欧美一区二区在线观看| 欧美巨乳美女视频| 欧美 日韩 成人| 99re91这里只有精品| 色悠悠久久综合| 亚洲精品乱码视频| 日本国产在线观看| 久久精品国产亚洲a| 69久久夜色精品国产69乱青草| 国精产品一区一区三区免费视频 | 久久一区二区电影| 国模视频一区| 亚洲成人免费av| 在线视频不卡一区二区| 日本韩国一区| 高清不卡一区二区| 成人激情春色网| 中文字幕免费高清网站| 激情久久婷婷| 国产一区二区三区在线免费观看| 国产精品一区二区无码对白| 日韩福利在线观看| 欧美性猛xxx| 妺妺窝人体色www看人体| 91网页在线观看| 国产亚洲综合性久久久影院| 国产综合av一区二区三区| 精品国产999久久久免费| 日韩成人午夜精品| 97超级碰碰碰久久久| 国产1区2区3区4区| 亚洲综合婷婷| xx视频.9999.com| 日本xxxx裸体xxxx| 久久精品色综合| 91精品国产综合久久蜜臀| 日韩a∨精品日韩在线观看| а√中文在线8| 1区2区3区欧美| 欧美日韩在线观看一区| 国产永久免费视频| 免费人成精品欧美精品| 欧美在线视频a| 久久久全国免费视频| 影视亚洲一区二区三区| 日韩最新中文字幕电影免费看| 中字幕一区二区三区乱码| 久久成人高清| 亚洲欧洲免费视频| av黄色在线免费观看| 欧美国产不卡| 日韩久久精品电影| 亚洲精品国产成人av在线| 欧美18免费视频| 亚洲国产精品美女| 亚欧洲乱码视频| 欧美日韩亚洲在线观看| 亚洲成人在线视频播放| 亚洲欧美日韩偷拍| 欧美三级午夜理伦三级小说| 精品爽片免费看久久| 3d动漫精品啪啪一区二区下载| 自拍视频一区| 亚洲欧美制服第一页| www.黄色在线| 伊人久久大香线蕉无限次| 精品久久久久久久久久久久久久久 | 97se狠狠狠综合亚洲狠狠| 国严精品久久久久久亚洲影视 | 《视频一区视频二区| 热久久最新地址| 91九色国产在线播放| 欧美日韩久久久久| 亚洲天堂av线| 国产免费区一区二区三视频免费| 日韩免费性生活视频播放| 中文字幕在线国产| 九九免费精品视频在线观看| 中文字幕精品视频| 69av视频在线| 麻豆亚洲精品| 国产激情视频一区| 99国产精品久久久久久久成人| 高清av一区二区| 久久亚洲综合网| 国产乱视频在线观看| 亚洲欧美日韩电影| 免费网站在线观看视频 | 国产另类xxxxhd高清| 欧美中文字幕一区二区三区亚洲| 肉色超薄丝袜脚交| 欧美丝袜足交| 色阁综合伊人av| 久久久久成人网站| 日韩精品亚洲一区| 91久久精品在线| 色婷婷av一区二区三区之红樱桃| av亚洲精华国产精华精| 中文字幕欧美日韩一区二区| 免费在线小视频| 欧美精品日韩精品| 激情五月婷婷基地| 免费欧美一区| 久久久久久久久久久免费| 特级做a爱片免费69| 国产一区二区美女| 色婷婷精品国产一区二区三区| 国产黄色在线免费观看| 色悠悠亚洲一区二区| 少妇熟女视频一区二区三区| 操欧美老女人| 欧美一级大片在线免费观看| 99产精品成人啪免费网站| 91在线精品秘密一区二区| 99精品一级欧美片免费播放| 日本美女一区| 亚洲国产精彩中文乱码av| 日韩在线一卡二卡| 男人的天堂成人在线| 懂色一区二区三区av片| 亚洲xxxxxx| 色综合色狠狠综合色| 中国特级黄色片| 色综合久久一区二区三区| 国产va免费精品高清在线| 黄色av中文字幕| 亚洲视频一区在线| 自拍偷拍一区二区三区四区| 精品自拍偷拍| 性亚洲最疯狂xxxx高清| 国产日韩欧美视频在线观看| 中文av一区特黄| 激情五月亚洲色图| 亚洲都市激情| 欧美一级淫片aaaaaaa视频| 国产乱码精品一区二区三区精东| 欧美激情一区二区三区不卡| 99精品免费在线观看| 日本欧美高清| 57pao成人国产永久免费| 日韩中文字幕免费在线观看| 亚洲视频 欧洲视频| 一区二区在线免费看| 日韩精品电影| 国产精品99久久久久久人| 精品黑人一区二区三区在线观看| 国产日韩欧美高清在线| wwwwww.色| 久久亚洲精品中文字幕蜜潮电影| 国产精品入口免费视| 黄色片免费在线| 欧美色爱综合网| 天天爽天天爽天天爽| 黑人巨大精品欧美一区| 亚洲国产精品影视| 一区二区日韩| 国内精品模特av私拍在线观看 | 亚洲第一级黄色片| 99热在线观看免费精品| 久久亚洲精华国产精华液| 日本中文字幕网址| 视频一区中文| 国产日韩精品电影| 狂野欧美性猛交xxxxx视频| 亚洲精品按摩视频| 亚洲第一精品在线观看| 国产欧美综合在线| 人妻巨大乳一二三区| 亚洲伦伦在线| 欧美大香线蕉线伊人久久| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲国产美女久久久久| 波多野结衣黄色网址| 亚洲欧美一区二区久久| 91九色蝌蚪porny| 天堂蜜桃91精品| 国产又黄又爽免费视频| 国产精品色在线网站| 日本久久久久久久久| 顶级网黄在线播放| 亚洲精品国产成人| 一二三区免费视频| 亚洲欧美日韩小说| 免费在线观看成年人视频| 奇米精品一区二区三区在线观看| 亚洲av综合色区| 久久91精品| 亚洲综合中文字幕在线| 色是在线视频| 久久福利视频网| 亚州av在线播放| 91.com视频| 伦av综合一区| 一区二区三区在线不卡| 亚洲女优在线观看| 国产盗摄女厕一区二区三区 | 蜜桃视频一区二区| 搞av.com| 国产精品久久观看| 国产精品一级久久久| 成人在线黄色| 2020国产精品视频| 女人黄色免费在线观看| 日韩精品福利网站| 国产成人精品亚洲精品色欲| 欧洲一区在线电影| 九九热在线视频播放| 亚洲综合丁香婷婷六月香| 成人在线观看免费高清| 99热这里都是精品| 欧美图片自拍偷拍| 狠狠色狠狠色合久久伊人| 国产超碰在线播放| 久久高清免费观看| 男女猛烈激情xx00免费视频| 亚洲澳门在线| 亚洲精品二区| 中国av一区| 精品九九九九| www.爱久久| 91系列在线观看| 日本免费成人| 国产精品久久久一区| 一本大道色婷婷在线| 欧美激情免费观看| 男女在线视频| 欧美激情精品久久久久久大尺度| caoporn97在线视频| 日韩网站在线观看| 69久久精品| 伊人伊成久久人综合网站| 免费福利在线视频| 精品99一区二区| 亚洲黄色小说网址| 欧美成人在线直播| 囯产精品一品二区三区| 日韩一卡二卡三卡| www.成人免费视频| 67194成人在线观看| 国产精品一区二区免费视频| 欧美日韩国产乱码电影| 亚洲熟妇av乱码在线观看| 欧美午夜久久久| 台湾佬中文在线| 色婷婷精品久久二区二区蜜臂av | 久久在线免费| 一区二区三区四区不卡| 精品视频网站| 亚洲国产精品久久久久久女王| 欧美色女视频| 日韩福利影院| 天天av综合| 男人天堂网站在线| 亚洲激情二区| 老熟妇仑乱视频一区二区| 九九视频精品免费| 亚洲天堂2024| 国产精品网站导航| 久久久久久欧美精品se一二三四| 日韩欧美aaa| a在线观看视频| 日韩精品视频免费专区在线播放| 国产精品久久一区二区三区不卡| 色一区av在线| 久草在线资源福利站| 国产乱人伦真实精品视频| 国内精品国产成人国产三级粉色| 欧美日韩一区二区三区免费| 夜间精品视频| 国产视频一区二区三区在线播放 | 欧美一级片黄色| 国产精品色呦呦| 欧美亚韩一区二区三区| 欧美日韩精品免费观看视频| 秋霞网一区二区| 久久色精品视频| 日韩性xxx| 国产伦精品一区二区三区高清版| 成人网18免费网站| 精品无码国模私拍视频| 寂寞少妇一区二区三区| 国产精品无码久久久久一区二区| 亚洲精品国产成人久久av盗摄| 黄色av网站免费观看| 欧美不卡一二三| 老司机精品影院| 日本精品久久久久影院| 亚洲性视频在线| 欧美爱爱视频网站| 免费久久99精品国产| 亚洲av片不卡无码久久| 亚洲午夜久久久久久久久久久| 最近中文字幕在线免费观看| 日韩精品一区二区视频| 99riav视频在线观看| 亚洲字幕在线观看| 成人精品影院| 亚洲熟妇av一区二区三区| 不卡视频一二三四| 色在线观看视频| 欧美日本在线观看| 国产系列电影在线播放网址| 欧洲亚洲妇女av| 奇米影视777在线欧美电影观看| 九九久久九九久久| 国产在线播放一区三区四| 国产午夜精品理论片在线| 欧美午夜精品一区二区蜜桃| 可以在线观看的av| 日本欧美中文字幕| 日日狠狠久久偷偷综合色| 欧美一级片免费播放| 成人在线综合网| 九九视频在线免费观看| 日韩精品一区二| 精精国产xxxx视频在线中文版| 亚洲精品欧美一区二区三区| 亚洲乱码电影| 久久无码人妻一区二区三区| 亚洲人成网站在线| 国产成人精品一区二三区四区五区| 日韩视频免费看| 国产精品久久久久久久久久久久久久久 | a√在线中文网新版址在线| 国产999精品久久久| 精品国产美女| av污在线观看| 日韩码欧中文字| 精品乱子伦一区二区| 久久久久成人网| 国产精品巨作av| 91黄色小网站| 国产欧美精品一区二区色综合 | 久久久久久久久艹| 亚洲成人久久久| 日韩性xxx| 99亚洲精品视频| 成人天堂资源www在线| 国产在线拍揄自揄拍| 亚洲国产成人久久| 国产精品扒开腿做爽爽爽视频软件| 亚洲精品久久久久久一区二区| 精品一区二区在线免费观看| 可以直接看的黄色网址| 亚洲福利视频网| 日本成人片在线| 超碰在线免费观看97| 成人精品国产一区二区4080| 午夜影院免费在线观看| 日韩在线观看视频免费| 亚洲高清在线一区| 黄色免费观看视频网站| 国产精品美女久久福利网站| www.日韩在线观看| 欧美孕妇毛茸茸xxxx| 99精品在线观看| 91丝袜在线观看| 欧美日韩一区中文字幕| 岛国毛片av在线| 日韩亚洲视频| 床上的激情91.| 正在播放木下凛凛xv99| 久久99国产综合精品女同| 久久爱www成人| 免费看91视频| 在线免费精品视频| 牛牛精品在线视频| 午夜午夜精品一区二区三区文| 国产精品综合一区二区| 亚洲大片免费观看| 欧美日韩国产第一页| 日韩高清欧美| 亚洲观看黄色网| 日韩一区二区电影在线|