《06.深入淺出ArkCompiler-public.pdf》由會員分享,可在線閱讀,更多相關《06.深入淺出ArkCompiler-public.pdf(27頁珍藏版)》請在三個皮匠報告上搜索。
1、深入淺出深入淺出ArkCompilerArkCompilerHarmonyHarmonyOSOS的應用高級開發語言的應用高級開發語言https:/ 代碼資產保護代碼資產保護?JavaScriptJavaScriptTypeScriptTypeScriptArkTSTSJS類型類型并發并發編程語言流行趨勢:編程語言流行趨勢:執行引擎執行引擎類型帶來的性能類型帶來的性能UnstableTypeOptimizedCodeCertain TypeOptimizedCode(check)Certain TypeType Misswarmwarmprofileprofile編譯優化視角主要區別:1.1.動
2、態類型動態類型到達到達 類型穩定態需要類型穩定態需要warmwarm時間時間2.2.動態類型語言需要檢查類型,更多機會窗口觸發逆優化動態類型語言需要檢查類型,更多機會窗口觸發逆優化TipsTips動態語言的靜態性動態語言的靜態性:JS 90%90%的ICIC是mono態語言語言benchmarkbenchmark性能分享性能分享(來源benchmark game)JS(JS(動動)vs.Dart)vs.Dart(靜)(靜):由于技術積累優勢導致Node.js Node.js 持平或者優于持平或者優于DartDartJS(JS(動動)vs.Java)vs.Java(靜)(靜):Java Java
3、 小優小優,互有優劣JavaJava(靜)(靜)vs.Swiftvs.Swift(靜)(靜):幾乎相當,幾乎相當,SwiftSwift優勢不明顯優勢不明顯技術分析技術分析動態語言的主要問題動態語言的主要問題1 1)在于達到類型穩態需要預熱時間)在于達到類型穩態需要預熱時間=啟動慢啟動慢2 2)優化代碼需要考慮逆優化(動態性)優化代碼需要考慮逆優化(動態性)=不好的代碼使得優化編譯結果更容易失效不好的代碼使得優化編譯結果更容易失效動態動態靜態靜態JITAOT/JITUnstableTypeOptimizedCode(check)Certain TypeOptimizedCode(check)Ce
4、rtain TypeType MisswarmprofileJSJSTSTSAOTJITTS Runtime+TSAOTTS Runtime+TSAOT應對技術方案應對技術方案動態語言的主要問題動態語言的主要問題1 1)在于達到類型穩態需要預熱時間)在于達到類型穩態需要預熱時間TS RuntimeTS Runtime+TSAOTTSAOT2 2)不好的代碼使得優化編譯結果更容易失效)不好的代碼使得優化編譯結果更容易失效ArkTSArkTS(應用編程語言)(應用編程語言)+Lint RulesLint Rules業界業界TS/JSTS/JS的問題的問題高性能高性能ArkTSArkTS引擎引擎 原
5、生支持類型的前端和運行時原生支持類型的前端和運行時單態多態未初始化復態業界業界Inline CacheInline CacheInline CacheInline Cache運行時狀態遷移運行時狀態遷移單態執行性能最高,多態其次。單態執行性能最高,多態其次。注:即使是注:即使是JSJS,實際大部分也是單態,實際大部分也是單態Class AClass B其它快速路徑 A快速路徑 B通用路徑程序動態執行點程序執行的類型不定點程序執行的類型不定點運行時生成運行時生成ICIC提速提速JVMJVM中中Call VirtualCall Virtual等少量使用等少量使用靜態類型靜態類型JSVMJSVM運行
6、時過程中不斷生成運行時過程中不斷生成Hidden ClassesHidden Classes和對應的和對應的ICICInline CacheInline CacheFrontendFrontendArkTS SourceClasse InfoBytecodes with TypeInfoClass AClass B快速路徑 A快速路徑 BInline CacheInline CacheArkTS FrontendArkTS FrontendArkTS RuntimeArkTS Runtime單態多態復態ArkTS Runtime1)類型對象靜態預生成2)運行時類型對象的動態綁定技術3)運行時內
7、聯緩存的預生成技術運行時直接加載編譯生成的類型運行時根據類型信息直接生成IC提速打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動開銷啟動開銷打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime高性能高
8、性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動開銷啟動開銷問題問題1 1:源碼需要編譯源碼需要編譯打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動開銷啟動開銷問題問題1 1:源碼需要編譯源碼需要編譯高性能預熱開銷高性能預熱開銷打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動開銷啟動開銷問題問題1 1:源
9、碼需要編譯源碼需要編譯高性能預熱開銷高性能預熱開銷問題問題2 2:類型運行時生成類型運行時生成打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動開銷啟動開銷問題問題1 1:源碼需要編譯源碼需要編譯高性能預熱開銷高性能預熱開銷問題問題2 2:類型運行時生成類型運行時生成問題問題3:3:運行信息獲?。簾狳c,行為特征運行信息獲?。簾狳c,行為特征打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runti
10、me高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動開銷(啟動開銷(1 1)高性能預熱開銷(高性能預熱開銷(2&32&3)Ark Build timeArk Build time解析源碼編譯字節碼(類型)編譯優化機器碼執行優化機器碼打包字節碼和優化機器碼安裝執行字節碼讀取Profile信息Ark RuntimeArk Runtime問題問題1 1方案:方案:帶類型的動態類型語言字節碼帶類型的動態類型語言字節碼問題問題3 3方案:方案:1.1.支持動態類型語言的類對象持久化支持動態類型語言的類對象持久化2.2.支持支持TS AOTTS AOT優化編譯優化編譯問題問題2 2方案:
11、方案:PGOPGO信息信息問題問題3 3方案:方案:優化機器碼的類型對象重綁優化機器碼的類型對象重綁高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼Runtime啟動開銷(啟動開銷(1 1)高性能預熱開銷(高性能預熱開銷(2&32&3)打包源碼Build time安裝解析源碼編譯字節碼執行字節碼獲取Profile信息編譯優化機器碼執行優化機器碼RuntimeArk Build timeArk Build time解析源碼編譯字節碼(類型)編譯優化機器碼執行優化機器碼打包字
12、節碼和優化機器碼安裝執行字節碼讀取Profile信息Ark RuntimeArk Runtime高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯編譯啟動可直接達到峰值性能,大幅提升啟動性能啟動可直接達到峰值性能,大幅提升啟動性能類型對象預生成類型字節碼機器碼AOT編譯AOTAOT文件生成和加載文件生成和加載TS/JS生態ArkTSTS/JSTS AST with typeArkTS ASTArkTS ApplicationArkTS/TS/JS parserType guided transformerABC FilesOptimizedabcType InformationJS-I
13、R-GraphBuild-GraphJS-typed-IR-GraphTyper-Infer:Type:HIR:IC:MIRIR-Graph+ICDCEGVNOptimize CodeGenCP/CCPLow IR*.anRuntimemmapAOT files DeserializeObjectsRelocate ObjectsExecution靜態優化編譯靜態優化編譯靜態類型分析推導靜態類型分析推導ArkTSArkTS前端編譯前端編譯MachineCodeCSETypeObjects高性能高性能ArkTSArkTS引擎引擎 AOTAOT編譯流程編譯流程并發優化:輕量化并發優化:輕量化&易用
14、易用JSJS世界的并發世界的并發Immutable Objectsmutable ObjectsGlobalInfrastructure OthersImmutable Objectsmutable ObjectsGlobalInfrastructure OthersImmutable Objectsmutable ObjectsGlobalInfrastructure OthersJS并發架構:Actor模型優勢:無鎖容易維護以及測試容錯性好分布式編程劣勢:啟動慢慢并發實例開銷大開銷大JS并發APIWorker創建Workerlet worker=new Worker(worker.js);
15、銷毀Worker主線程關閉Workerworker.terminate();Worker線程中關閉自己close();消息傳遞主線程向Worker發送消息worker.postMessage(messageObject,arrObj1,arrObj2.);主線程從特定worker收到消息時的處理函數worker.onmessage(messageObject)=function(e)_Worker線程向主線程發送消息postMessage(messageObject,arrObj1,arrObj2.);Worker線程從主線程收到消息時的處理函數onMessage(messageObject)
16、=function(e).需要封裝和解析消息命令封裝和解析消息命令需要關心關心Worker實例的生命周期生命周期高負載高負載/低負載低負載需要精確調節精確調節WorkerWorker數量數量開發者開發者輕量化并發:輕量化并發:Lite ActorLite Actor方舟編譯運行時:支持不可變對象共享基礎架構輕量化Immutable Objectsmutable ObjectsGlobalInfrastructure Immutable Objectsmutable ObjectsGlobalInfrastructure OthersImmutable Objectsmutable Object
17、sGlobalInfrastructure OthersImmutable Objectsmutable ObjectsGlobalInfrastructure OthersOthersmutable ObjectsOthersmutable ObjectsOthers性能:啟動時間大幅提升啟動內存大幅優化業界TS/JS并發實例運行ArkCompiler并發實例運行提供提供TaskPoolTaskPool更易用的并發任務更易用的并發任務APIAPITaskPoolTaskPool優勢:優勢:開發者易于開發并發任務開發者易于開發并發任務易用直觀,減少代碼編寫量無需關心并發實例的生命周期無需關心場
18、景下并發任務負載輕重統一任務負載資源管理統一任務負載資源管理降低系統資源消耗(注:減少線程數,減少線程的內存等資源消耗)提升系統的整體性能(注:降低調度成本)Worker APIWorker API例子例子TaskPool API TaskPool API 例子例子應用主線程代碼應用主線程代碼WorkerWorker代碼代碼應用代碼應用代碼TaskPoolTaskPool統一任務池設計架構統一任務池設計架構Task Dispatch ManagerTask Worker 1 Task QueueTask Worker 2 Task Worker 6Task Worker ThreadsTask
19、PoolTaskPoolTaskPool TaskPool 架構架構Task Dispatch ManagerTask Dispatch Manager優先級調度優先級調度負載均衡負載均衡系統系統統一管理統一管理Task Worker ThreadsTask Worker Threads自適應自適應可伸縮可伸縮Task Worker 7 并發模型的下一步演進并發模型的下一步演進并發實例的進一步輕量化并發實例的進一步輕量化探索共享對象的無鎖并發探索共享對象的無鎖并發更輕更快更輕更快 共享更多的基礎設施 共享可變對象無鎖、易用、安全無鎖、易用、安全 凍結 轉移Immutable Objectsmu
20、table ObjectsGlobalInfrastructure Othersmutable ObjectsOthersmutable ObjectsOthers現狀現狀Immutable ObjectsInfrastructure GlobalSharableMutableObjectsUnsharedObjectsOthersUnsharedObjectsOthersUnsharedObjectsOthers演進演進安全:代碼資產的保護安全:代碼資產的保護JS/TSJS/TS的代碼痛點的代碼痛點保護應用源碼保護應用源碼TS/JS SourceobfuscatorobfuscatorObf
21、uscated JS SourceJS SourceArkTS/TS/JS SourceobfuscatorobfuscatorObfuscated BytecodeBytecode方舟編譯器方案方舟編譯器方案混淆功能強強源碼不可見不可見商用應用源碼商用應用源碼安全性高安全性高業界業界方舟編譯器方舟編譯器社區方案社區方案混淆功能弱弱源碼可見可見可調試調試商用應用源碼商用應用源碼安全性差安全性差字節碼的高級混淆保護開發者代碼資產字節碼的高級混淆保護開發者代碼資產VSVSuse strict;(function()let a=new Array;function n(n)a.push(n)func
22、tion e()let e=0;a.forEach(n=e=function e()let e=0;a.forEach(n=e=n.age+en.age+e);return e/);return e/a.lengtha.length n(id:1,name:rob,age:22);n(id:2,name:bill,age:26);console.log(e()();(function()type Person=id:number;name:string;age:number let persons:Person=new Array();function register(person:Pers
23、on):void persons.push(person);function avgAge():number function avgAge():number let total:number=0;let total:number=0;persons.forEach(p=total=persons.forEach(p=total=p.agep.age+total);+total);return total/return total/persons.lengthpersons.length register(id:1,name:rob,age:22);register(id:2,name:bil
24、l,age:26);console.log(avgAge();/24)();混淆功能弱弱源碼可見可調試可見可調試商用應用源碼商用應用源碼安全性差安全性差混淆功能強強源碼不可見不可見商用應用源碼商用應用源碼安全性高安全性高名稱混淆名稱混淆控制混淆控制混淆算術混淆算術混淆數據加密數據加密調用隱藏調用隱藏代碼保護代碼保護方舟編譯器代碼靜動態保護方舟編譯器代碼靜動態保護不斷演進中不斷演進中開發者源碼社區打包方舟編譯產物反編譯字節碼謝 謝歡迎關注HarmonyOS開發者微信公眾號掃碼參加HarmonyOS 線上開發者活動 HarmonyOS 第一課 ArkUI 入門訓練營 Codelabs 挑戰賽 HarmonyOS 體驗官征文