亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Swift編譯時間這么慢?

為什么Swift編譯時間這么慢?

猛跑小豬 2019-12-09 09:11:06
我正在使用Xcode 6 Beta 6。這已經困擾了我一段時間,但是現在已經到了幾乎無法使用的地步。我的項目已經開始有一個體面的65個斯威夫特文件的大小和幾個橋接Objective-C的文件(這是真的不是問題的原因)。似乎對任何Swift文件進行任何微小的修改(例如在應用中幾乎未使用的類中添加簡單的空白)都會導致重新編譯指定目標的整個Swift文件。經過更深入的研究后,我發現CompileSwiftXcode在swiftc目標的所有Swift文件上運行命令的階段占了編譯器時間的幾乎100%。我做了進一步的調查,如果僅使用默認控制器保留應用程序委托,則編譯速度非常快,但是隨著我添加越來越多的項目文件,編譯時間開始變得很慢?,F在只有65個源文件,每次編譯大約需要8/10秒。一點也不快。我還沒有看到任何帖子談到這個問題,除了這一個,但所以我想知道如果我在這種情況下,只有一個,這是一個舊版本的Xcode 6。我已經在GitHub上檢查了一些Swift項目,例如Alamofire,Euler和CryptoSwift,但是它們都沒有足夠的Swift文件可以進行實際比較。我發現唯一一個啟動時大小合適的項目是SwiftHN,即使它只有十幾個源文件,我仍然能夠驗證同一件事,一個簡單的空間,整個項目需要重新編譯,這開始需要一個很少的時間(2/3秒)。與分析器和編譯都快速發展的Objective-C代碼相比,這確實讓Swift永遠無法處理大型項目,但是請告訴我我錯了。Xcode 6 Beta 7更新仍然沒有任何改善。這開始變得荒謬。由于缺少#importSwift,我真的看不到蘋果將如何進行優化。不要像我那樣高興得太快。他們用來使構建增量的圖形求解器尚未得到很好的優化。的確,首先,它并不關注函數簽名的更改,因此,如果在一個方法的塊中添加空格,則將重新編譯所有依賴該類的文件?,F在,如果您進行修改FileA,則編譯器顯然會標記FileA為要重新編譯。它還將重新編譯FileB(根據對的更改,這將是可以的FileA),而且還FileC因為FileB重新編譯了,這很糟糕,因為在此FileC從未使用FileA過。因此,我希望他們能改進依賴關系樹求解器...我已經用此示例代碼打開了雷達。Xcode 7 beta 5和Swift 2.0更新昨天,Apple發布了Beta 5,在發布說明中我們可以看到:Swift語言和編譯器?增量構建:僅更改函數的主體將不再導致依賴文件的重建。(15352929)我已經嘗試過了,我必須說它現在真的(真的?。┻\行良好。他們迅速優化了增量構建。我烈建議您創建一個swift2.0分支,并使用XCode 7 beta 5使代碼保持最新。您會對編譯器的增強功能感到滿意(但是我會說XCode 7的全局狀態仍然很慢且有錯誤)。Xcode 8.2更新自從我最近一次更新此問題以來已經有一段時間了。現在,我們的應用程序大約有2萬行代碼,幾乎都是Swift代碼,雖然不錯,但并不出色。它經歷了迅速的2遷移,而不是迅速的3遷移。在2014年中的Macbook pro(2.5 GHz Intel Core i7)上進行編譯大約需要5 / 6m,這在干凈的版本上還可以。但是,盡管蘋果聲稱:增量構建仍然是一個笑話:僅發生很小的更改時,Xcode不會重建整個目標。(28892475)顯然,我認為我們很多人在檢查了這個廢話之后就笑了(向我項目的任何文件添加一個私有(私有?。傩远紩匦戮幾g整個過程……)我想指出你們在Apple開發人員論壇上的這個線程,該線程上有關于此問題的更多信息(以及不時地對此事的Apple開發人員的交流)基本上人們想出了一些方法來嘗試改進增量構建:將HEADER_MAP_USES_VFS項目設置添加到true禁用Find implicit dependencies您的方案創建一個新項目,然后將文件層次結構移至新項目。我將嘗試解決方案3,但解決方案1/2不適用于我們。具有諷刺意味的是,在整個情況下,有趣的是,當我們遇到第一個編譯緩慢問題時,盡管我們從Apple那里獲得了實際的改進,但在第一篇文章中,我們使用的是Xcode 6和Swift 1或Swift 1.1代碼。這種情況與Xcode 6一樣糟糕。實際上,我真的很后悔為我們的項目選擇Swift而不是Obj / C,因為它每天都會令人沮喪。(我什至改用AppCode,但這是另一個故事)無論如何,截至撰寫本文時,我看到這則SO帖子具有32k +的視圖和143個ups,所以我想我不是唯一的一個。盡管對這種情況感到悲觀,但還是呆在那兒,隧道盡頭可能有些亮光。
查看完整描述

3 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

如果您試圖確定特定的文件來減慢編譯時間,則可以嘗試通過xctool在命令行中對其進行編譯,這將使您逐文件進行編譯。


需要注意的是,默認情況下,每個CPU內核同時構建2個文件,不會為您提供“凈”使用時間,而是給您絕對的“用戶”時間。這樣,所有時間在并行化文件之間變得均勻,并且看起來非常相似。


為了克服這個問題,請將-jobs標志設置為1,這樣它就不會并行化文件構建。這將花費更長的時間,但最終您將獲得“凈”編譯時間,可以按文件進行比較。


這是一個應做的技巧示例命令:


xctool -workspace <your_workspace> -scheme <your_scheme> -jobs 1 build


“編譯Swift文件”階段的輸出類似于:


...

   ? Compile EntityObserver.swift (1623 ms)

   ? Compile Session.swift (1526 ms)

   ? Compile SearchComposer.swift (1556 ms)

...

從此輸出中,您可以快速確定哪些文件比其他文件花費的時間更長。此外,您可以高精度確定重構(顯式強制轉換,類型提示等)是否正在降低特定文件的編譯時間。


注意:從技術上講,您也可以這樣做,xcodebuild但是輸出的內容非常冗長且難以使用。


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 1043 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號