国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ARM嵌入式編譯器編譯優(yōu)化選項(xiàng) -O

這篇具有很好參考價(jià)值的文章主要介紹了ARM嵌入式編譯器編譯優(yōu)化選項(xiàng) -O。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Arm嵌入式編譯器可以執(zhí)行一些優(yōu)化來(lái)減少代碼量并提高應(yīng)用程序的性能。不同的優(yōu)化級(jí)別有不同的優(yōu)化目標(biāo),不僅如此,針對(duì)某個(gè)目標(biāo)進(jìn)行優(yōu)化會(huì)對(duì)其他目標(biāo)產(chǎn)生影響。比如想減小生成的代碼量,勢(shì)必會(huì)影響到該代碼的性能。所以?xún)?yōu)化級(jí)別總是這些不同目標(biāo)(代碼量,程序性能,debug信息)之間的權(quán)衡。

目錄

Optimization level -O0

Optimization level -O1?

Optimization level -O2

Optimization level -O3

Optimization level -Os

Optimization level -Oz

Optimization level -Omin

Optimization level -Ofast

Optimization level -Omax


Arm Compiler for Embedded提供了各種優(yōu)化級(jí)別來(lái)控制不同的優(yōu)化目標(biāo):

優(yōu)化目標(biāo) 可用的優(yōu)化級(jí)別
更小的代碼量 -Oz,?-Omin
更快的性能 -O2,?-O3,?-Ofast,?-Omax
兼顧代碼量和debug信息 -O1
源代碼和生成代碼之間更好的相關(guān)性 -O0?(no optimization)
更快的編譯和構(gòu)建時(shí)間 -O0?(no optimization)
在代碼量和性能之間的平衡 -Os
  • 如果對(duì)性能使用更高的優(yōu)化級(jí)別,那么它對(duì)其他目標(biāo)的影響也會(huì)更大,例如調(diào)試體驗(yàn)降低、代碼大小增加和編譯和構(gòu)建時(shí)間增加。
  • 如果優(yōu)化目標(biāo)是減少代碼大小,那么它會(huì)對(duì)其他目標(biāo)產(chǎn)生影響,例如降低調(diào)試體驗(yàn)、降低性能和增加編譯和構(gòu)建時(shí)間。?

所以用戶(hù)可以根據(jù)自己的編譯目標(biāo),選擇適合自己的編譯優(yōu)化等級(jí):

Optimization level -O0

-O0?將禁用所有優(yōu)化

這個(gè)優(yōu)化級(jí)別是默認(rèn)的。使用-O0的結(jié)果是更快的編譯和構(gòu)建時(shí)間,但產(chǎn)生的代碼,其性能比其他優(yōu)化級(jí)別低,代碼大小和堆棧使用也會(huì)明顯高于其他優(yōu)化級(jí)別。由于沒(méi)有任何優(yōu)化,所以生成的代碼與源代碼密切相關(guān),這導(dǎo)致生成的代碼明顯更多,包括死代碼(dead code)。

Optimization level -O1?

-O1在編譯器中啟用內(nèi)核優(yōu)化(core optimizations)。-O1便于用戶(hù)調(diào)試,代碼質(zhì)量?jī)?yōu)于-O0。此外,堆棧的使用也比使用-O0時(shí)得到了改善。如果想調(diào)試程序,建議使用-O1來(lái)獲取更多的調(diào)試信息。與使用-O0相比,使用-O1的不同之處在于:

  • 啟用了優(yōu)化,這可能會(huì)降低調(diào)試信息的保真度(fidelity)。
  • 啟用了內(nèi)聯(lián),這意味著函數(shù)調(diào)用棧的回溯,可能不會(huì)像閱讀源代碼那樣,具有層級(jí)關(guān)系,內(nèi)聯(lián)會(huì)把函數(shù)體直接加載到函數(shù)調(diào)用的地方。
  • 如果不需要函數(shù)返回的結(jié)果,則一個(gè)沒(méi)有副作用的函數(shù)在預(yù)期的地方可能不會(huì)被調(diào)用,甚至?xí)缓雎浴?/li>
  • 局部變量的值在不再使用后可能無(wú)法在其作用域中被獲取使用。例如,它們所在棧位置可能已經(jīng)被其他模塊使用了。

Optimization level -O2

與-O1相比,-O2對(duì)性能進(jìn)行了更高的優(yōu)化。這一層是編譯器自動(dòng)生成矢量指令(vector instructions)的第一個(gè)優(yōu)化層。它還降低了調(diào)試體驗(yàn),并且可能導(dǎo)致代碼量的增加。與使用- O1相比,使用-O2的不同之處在于:

  • 增加內(nèi)聯(lián)函數(shù)調(diào)用的閾值。
  • 執(zhí)行的循環(huán)展開(kāi)次數(shù)可能會(huì)增加。
  • 矢量指令可以為簡(jiǎn)單循環(huán)和獨(dú)立標(biāo)量操作的相關(guān)序列生成??梢允褂胊rmclang命令行選項(xiàng)-fno-vectorize來(lái)禁止矢量指令的創(chuàng)建。

Optimization level -O3

與-O2相比,-O3是更高的性能優(yōu)化。此優(yōu)化級(jí)別需要大量編譯時(shí)分析和資源的優(yōu)化,-O3指示編譯器優(yōu)化生成代碼的性能,而忽略生成代碼的量,這可能導(dǎo)致代碼量增加。與-O2相比,它還降低了調(diào)試體驗(yàn)。并且:

  • 增加內(nèi)聯(lián)函數(shù)調(diào)用的閾值。
  • 執(zhí)行的循環(huán)展開(kāi)次數(shù)可能會(huì)增加。
  • 在編譯器流水線(xiàn)上,實(shí)施更加激進(jìn)的指令優(yōu)化策略。

Optimization level -Os

-Os的目標(biāo)在不顯著增加代碼大小的情況下提供高性能。取決于用戶(hù)的代碼,-Os提供的性能可能與-O2或-O3相似。與-O3相比,-Os減少了代碼量。與-O1相比,它還降低了調(diào)試體驗(yàn)。與使用-O3相比,使用-Os的不同之處在于:

  • 降低了內(nèi)聯(lián)函數(shù)調(diào)用的閾值。
  • 執(zhí)行的循環(huán)展開(kāi)的數(shù)量顯著降低。

Optimization level -Oz

-Oz的目標(biāo)是在不使用鏈接時(shí)間優(yōu)化(LTO)的情況下提供更小的代碼量。如果LTO不適合用戶(hù)的應(yīng)用程序,Arm建議可以使用此選項(xiàng)以獲得最佳代碼大小。與-O1相比,此優(yōu)化級(jí)別降低了調(diào)試體驗(yàn)。與使用-Oz相比:

  • 編譯器只針對(duì)代碼大小進(jìn)行優(yōu)化,而忽略性能優(yōu)化,這可能導(dǎo)致代碼變慢。
  • 未禁用函數(shù)內(nèi)聯(lián)。在某些情況下,內(nèi)聯(lián)可以減少總體代碼大小,例如,如果一個(gè)函數(shù)只被調(diào)用一次。
  • 禁止一些可能增加代碼量的優(yōu)化,比如將循環(huán)展開(kāi),循環(huán)矢量化等。
  • 針對(duì)M系列的AArch32以及其他的AArch64目標(biāo),將使能外聯(lián)(outlining)功能。外聯(lián)器(outliner?)將搜索代碼中相同sequence的代碼,并將它們放在同一個(gè)函數(shù)當(dāng)中,然后用調(diào)用同一個(gè)函數(shù)的方式來(lái)取代這些相同的代碼段。外聯(lián)可以減小代碼大小,但是增加了代碼執(zhí)行時(shí)間。用戶(hù)可以使用-moutline, -mno-outline選項(xiàng)來(lái)手動(dòng)開(kāi)啟或者關(guān)閉該功能。

Optimization level -Omin

通過(guò)使用LTO功能的子集,-Omin旨在提供比-Oz更小的代碼量。與使用-Oz相比,使用-Omin的不同之處在于:

  • -Omin支持一組基本的LTO,旨在刪除未使用的代碼和數(shù)據(jù),同時(shí)還嘗試優(yōu)化全局內(nèi)存訪(fǎng)問(wèn)。
  • -Omin支持消除虛函數(shù)(C++)。

如果希望在-Omin下進(jìn)行編譯,并使用單獨(dú)的編譯和鏈接步驟,那么還必須在armlink命令行中包含-Omin。

Optimization level -Ofast

-Ofast執(zhí)行-O3級(jí)的優(yōu)化,包括那些使用armclang選項(xiàng)-ffast-math執(zhí)行的優(yōu)化。該級(jí)別還執(zhí)行其他可能違反嚴(yán)格遵守語(yǔ)言標(biāo)準(zhǔn)的激進(jìn)優(yōu)化。與-O3相比,此級(jí)別降低了調(diào)試體驗(yàn),并且可能導(dǎo)致代碼大小增加。

Optimization level -Omax

-Omax執(zhí)行最大優(yōu)化,并專(zhuān)門(mén)針對(duì)性能優(yōu)化。它支持從-Ofast到LTO的所有優(yōu)化。在這個(gè)優(yōu)化級(jí)別上,Arm嵌入式編譯器可能會(huì)違反嚴(yán)格遵守語(yǔ)言標(biāo)準(zhǔn)。使用此優(yōu)化級(jí)別可以獲得最快的性能。與-Ofast相比此級(jí)別降低了調(diào)試體驗(yàn),并且可能導(dǎo)致代碼大小增加。如果用戶(hù)希望在-Omax下進(jìn)行編譯,并且有單獨(dú)的編譯和鏈接步驟,那么您還必須在armlink命令行中包含-Omax。

示例

int test()
{
    int x=10, y=20;
    int z;
    z=x+y;
    return 0;
}

在上述代碼中,int x=10?z=x+y ,兩行代碼為死代碼(dead code),如果使用-O0,則不進(jìn)行任何優(yōu)化,這兩行將會(huì)被編譯生成到源文件中:

armclang --target=arm-arm-none-eabi -march=armv7-a -O0 -S file.c

如果使用-O1,這兩行將會(huì)被忽略:

armclang --target=arm-arm-none-eabi -march=armv7-a -O1 -S file.c文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-603019.html

Selecting optimization optionshttps://developer.arm.com/documentation/100748/0620/Using-Common-Compiler-Options/Selecting-optimization-options?lang=en

到了這里,關(guān)于A(yíng)RM嵌入式編譯器編譯優(yōu)化選項(xiàng) -O的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 一個(gè)關(guān)于編譯器優(yōu)化選項(xiàng)問(wèn)題的解決

    一個(gè)關(guān)于編譯器優(yōu)化選項(xiàng)問(wèn)題的解決

    因?yàn)楫?dāng)前項(xiàng)目單片機(jī)容量不夠使用,打算開(kāi)啟編譯器優(yōu)化,結(jié)果在使用KEIL編譯器優(yōu)化后,程序在發(fā)送Modbus數(shù)據(jù)時(shí),程序直接跑飛了 最后發(fā)現(xiàn)是 局部變量指針 作為了DMA的內(nèi)存地址參數(shù),導(dǎo)致當(dāng)DMA連續(xù)搬運(yùn)數(shù)據(jù)時(shí),實(shí)際那個(gè)局部變量已經(jīng)被釋放,導(dǎo)致DMA搬運(yùn)數(shù)據(jù)的過(guò)程中出現(xiàn)錯(cuò)

    2024年04月09日
    瀏覽(38)
  • C++代碼性能優(yōu)化的好處與缺點(diǎn)?有哪些編譯器優(yōu)化選項(xiàng)?

    性能優(yōu)化是C++編程中的一個(gè)重要方面,它可以帶來(lái)許多好處,但也有一些潛在的缺點(diǎn)。 以下是C++代碼性能優(yōu)化的一些優(yōu)缺點(diǎn): 優(yōu)點(diǎn): 提高執(zhí)行速度 : 優(yōu)化后的代碼可以更快地執(zhí)行,這對(duì)于需要處理大量數(shù)據(jù)或需要快速響應(yīng)的應(yīng)用程序尤其重要。 減少資源消耗 : 優(yōu)化可以減少

    2024年03月27日
    瀏覽(41)
  • 性能優(yōu)化:編譯器優(yōu)化選項(xiàng) -O2/-O3 究竟有多強(qiáng)大?

    性能優(yōu)化:編譯器優(yōu)化選項(xiàng) -O2/-O3 究竟有多強(qiáng)大?

    之前的“性能優(yōu)化的一般策略及方法”一文中介紹了多種性能優(yōu)化的方法。根據(jù)以往的項(xiàng)目經(jīng)驗(yàn), 開(kāi)啟編譯器優(yōu)化選項(xiàng) 可能是立竿見(jiàn)影、成本最低、效果最好的方式了。 這么說(shuō)可能還不夠直觀(guān),舉個(gè)真實(shí)的例子:我所參與的自動(dòng)駕駛的項(xiàng)目中,無(wú)需修改任何代碼,僅僅增加

    2024年03月15日
    瀏覽(40)
  • Keil5,ARM編譯器 軟件優(yōu)化注意事項(xiàng)

    循環(huán)是大多數(shù)程序中的常見(jiàn)結(jié)構(gòu)。由于大量的執(zhí)行時(shí)間通?;ㄙM(fèi)在循環(huán)中,因此值得關(guān)注時(shí)間關(guān)鍵循環(huán)。 如果不謹(jǐn)慎地編寫(xiě),環(huán)路終止條件可能會(huì)導(dǎo)致大量開(kāi)銷(xiāo)。在可能的情況下: 使用簡(jiǎn)單的終止條件。 寫(xiě)入倒計(jì)時(shí)到零循環(huán)。 使用? unsigned int ?類(lèi)型的計(jì)數(shù)器。 測(cè)試與零的

    2024年02月03日
    瀏覽(23)
  • 嵌入式:ARM常用開(kāi)發(fā)編譯軟件介紹

    嵌入式:ARM常用開(kāi)發(fā)編譯軟件介紹

    ADS(ARM Developer Suite),是在1993年由Metrowerks公司開(kāi)發(fā)是ARM處理器下最主要的開(kāi)發(fā)工具。 他的前身是SDT,SDT是ARM公司幾年前的開(kāi)發(fā)環(huán)境軟件,目前SDT早已經(jīng)不再升級(jí)。ADS包括了四個(gè)模塊分別是:SIMULATOR;C 編譯器;實(shí)時(shí)調(diào)試器;應(yīng)用函數(shù)庫(kù)。ADS對(duì)匯編、C/C++、java支持的均很好,

    2024年02月06日
    瀏覽(107)
  • 【ARM 嵌入式 編譯系列 2.1 -- GCC 編譯參數(shù)學(xué)習(xí)】

    請(qǐng)閱讀 【ARM GCC 編譯專(zhuān)欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 2 – GCC 編譯過(guò)程介紹 下篇文章:ARM 嵌入式 C 入門(mén)及漸進(jìn) 3 – GCC attribute ((weak)) 弱符號(hào)使用 上篇文章 ARM 嵌入式 編譯系列 2 – GCC 編譯過(guò)程介紹 已經(jīng)介紹過(guò)了具體的編譯流程,本篇文章主要介紹變過(guò)程中常見(jiàn)的

    2024年02月13日
    瀏覽(51)
  • 【ARM 嵌入式 編譯系列 3.5 -- gcc 鏈接參數(shù)介紹】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專(zhuān)欄 之 ARM GCC 編譯專(zhuān)欄】 上篇文章【ARM 嵌入式 編譯系列 3.4 – 查看所依賴(lài)庫(kù)文件的路徑 詳細(xì)介紹】一直在提 鏈接參數(shù) ,那么鏈接參數(shù)有哪些,它們又有什么作用呢? 如前一篇文章中的的鏈接參數(shù)到底是什么意思呢? -L : 指定了 鏈接庫(kù)的路徑

    2024年01月17日
    瀏覽(44)
  • 【ARM 嵌入式 編譯系列 10.4 -- 生成二進(jìn)制文件】

    在嵌入的工作中,經(jīng)常會(huì)使用到二進(jìn)制文件,那么我們?nèi)绾巫约荷梢粋€(gè)二進(jìn)制文件呢?接下來(lái)介紹如何將一個(gè)只包含將32位數(shù)據(jù)的文件轉(zhuǎn)化為二進(jìn)制文件,原文件如下(數(shù)據(jù)一共 64bytes): 我們使用 gcc 對(duì)齊先進(jìn)行編譯然后再進(jìn)行反匯編: 具體命令如下: 通過(guò)上面命令會(huì)生成

    2024年02月02日
    瀏覽(62)
  • 【ARM 嵌入式 編譯 Makefile 系列 2 - Makefile 如何打印信息】

    請(qǐng)閱讀 【ARM GCC Makefile 編譯專(zhuān)欄導(dǎo)讀】 下篇文章:【ARM 嵌入式 編譯 Makefile 系列 2.1 - Makefile info,warn, error 打印詳細(xì)介紹】 上篇文章:【ARM 嵌入式 編譯 Makefile 系列 1 - Makefile 如何調(diào)用 shell 腳本】 在Makefile中,我們可以使用echo命令來(lái)打印信息。這種方法適用于大多數(shù)的 UNI

    2024年02月12日
    瀏覽(47)
  • 【ARM 嵌入式 編譯系列 3.4 -- libgcc.a 詳細(xì)介紹】

    【ARM 嵌入式 編譯系列 3.4 -- libgcc.a 詳細(xì)介紹】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專(zhuān)欄 之 ARM GCC 編譯專(zhuān)欄】 libgcc 是GCC的一部分。C語(yǔ)言不僅僅是由編譯器構(gòu)成,還包括了一個(gè)標(biāo)準(zhǔn)庫(kù)。編譯器在 GCC包里 ,標(biāo)準(zhǔn)庫(kù)則位于 GNU C庫(kù)里 ,即glibc包里。C編譯器(cc1)肯定是要依賴(lài) glibc庫(kù)才能正常運(yùn)行。 但是編譯器本身還使用了一個(gè)內(nèi)部

    2024年01月20日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包