優化選項
-flto
-
Whole Program Mode(整個程序模式):在這種模式下,編譯器對整個程序進行優化。它通過將所有源文件合并成一個單獨的中間表示(IR)文件,然后進行全局的優化和代碼生成。這種模式可以提供更大的優化空間,因為編譯器可以看到整個程序的上下文信息,從而進行更準確的優化。但是,它需要更多的時間和資源來處理整個程序,因此編譯時間會增加。
-
LTRANS(Link-Time Transformer)模式:在這種模式下,編譯器對每個源文件進行優化,并將優化后的中間表示(IR)文件保存到目標文件中。最后,鏈接器將這些目標文件組合在一起,并進行進一步的優化。這種模式對于大型項目來說更具可行性,因為它可以將優化過程分布在多個編譯和鏈接階段,從而減少了單個編譯過程的資源消耗。然而,由于無法全局優化整個程序,它可能無法實現某些全局優化的效果。
-flto=thin
thinLTO是GCC引入的一種折衷方案,它結合了整個程序模式和LTRANS模式的優點. 在鏈接階段,鏈接器可以使用這些索引文件來進行全局的優化和代碼生成。它會根據需要只選擇需要的函數和變量,而不必處理整個程序。這樣既減少了編譯時間和資源消耗,又能夠實現一定程度的全局優化。ThinLTO模式在大型項目中特別有用,因為它能夠提供較好的優化效果,同時還保持了相對較低的編譯時間和資源消耗。
LTRANS(Link-Time Transformer)和ThinLTO(Thin Link-Time Optimization)是兩種不同的鏈接時優化(Link-Time Optimization,簡稱LTO)方式,它們在實現和效果上有一些區別。
-
實現方式:
- LTRANS:LTRANS模式將每個源文件編譯為優化后的目標文件,并將這些目標文件保存在最終的可執行文件中。在鏈接階段,目標文件之間會進行進一步的優化和代碼生成。
- ThinLTO:ThinLTO模式將每個源文件編譯為精簡的中間表示(IR)文件,并生成一個索引文件。在鏈接階段,鏈接器根據需要選擇并優化相關的函數和變量,而不必處理整個程序。
-
優化范圍:
- LTRANS:LTRANS模式對整個程序進行全局優化。由于可以看到整個程序的上下文信息,因此可以進行更準確和全面的優化。但是,這可能導致編譯時間和資源消耗增加。
- ThinLTO:ThinLTO模式只對需要的函數和變量進行優化。通過使用索引文件,在鏈接階段選擇和優化相關的部分,以減少編譯時間和資源消耗。但由于無法全局優化整個程序,某些全局優化的效果可能不如LTRANS模式。
-
適用范圍:
- LTRANS:LTRANS模式適用于大型項目,可以提供更高的優化水平。它可以處理整個程序,但可能需要更長的編譯時間和更多的資源。
- ThinLTO:ThinLTO模式在大型項目中也很有用,因為它可以在一定程度上實現全局優化,并減少編譯時間和資源消耗。由于它只處理相關的部分,因此在某些情況下,優化效果可能稍遜于LTRANS模式。
總體而言,LTRANS和ThinLTO都是有效的鏈接時優化方式,但根據項目的規模、編譯時間和優化需求來選擇適合的模式。LTRANS模式提供了更高的優化水平,而ThinLTO模式則在資源消耗方面更為友好。
-march
選項用于指定目標處理器的架構
?-march
選項后面可以跟隨特定的處理器架構名稱,比如-march=core2
、-march=armv8-a
等。這樣編譯器就會根據目標處理器的架構來選擇合適的指令集,并對代碼進行相應的優化,以充分利用處理器的功能和特性。
需要注意的是,使用-march
選項進行優化時,需要確保目標處理器與編譯后的可執行文件運行的環境是匹配的。如果在較新的處理器上進行編譯優化,可能會導致生成的可執行文件在較老的處理器上無法正常運行。因此,在選擇-march
選項時,需要考慮目標處理器的實際環境和要求。
優化等級
00:無優化。編譯器只進行語法檢查和生成目標代碼,不進行任何優化操作。這種等級通常用于調試和代碼分析。
O1優化會消耗少多的編譯時間,它主要對代碼的分支,常量以及表達式等進行優化。如去除未使用的函數、內聯簡單函數等,以提高執行速度。?
O2會嘗試更多的寄存器級的優化以及指令級的優化,它會在編譯期間占用更多的內存和編譯時間。?如循環展開、函數調用優化等。這種等級適用于對性能有較高要求的場景。
O3在O2的基礎上進行更多的優化,例如使用偽寄存器網絡,普通函數的內聯,以及針對循環的更多優化。?更激進的內聯、更復雜的循環優化等。這種等級適用于對性能要求非常高且可以接受編譯時間延長的情況。
Os主要是對代碼大小的優化,我們基本不用做更多的關心。?通常各種優化都會打亂程序的結構,讓調試工作變得無從著手。并且會打亂執行順序,依賴內存操作順序的程序需要做相關處理才能確保程序的正確性。??