gcc的優化功能

代碼優化的目的是改善程序的執行性能。gcc提供的代碼優化功能非常強大,它通過參數-On來控制優化代碼的生成,其中n為優化級別的整數,比較典型的范圍是從0變化到2或3(與版本有關)。

編譯時通過使用選項-O可以告訴gcc同時減小代碼的長度和執行時間,其效果等價于-O1,在這一級別上能夠進行的優化類型雖然取決于目標處理器,但一般都會包括線程跳轉和延遲退棧兩種優化。選項-O2除了完成所有-O1級別的優化外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項O3除了完成所有-O2級別的優化外,還包括循環展開和其他一些與處理器特性相關的優化工作。數字越大優化的等級越高,程序的運行速度更快。一般采用-O2選項,因為它在優化長度、編譯時間和代碼大小之間取得了一個比較理想的平衡點。

借助Linuxtime命令,可以大致統計出該程序在運行時所需要的時間,注意此時最好退出其它程序。

[root@localhost work]# gcc -Wall hello.c -o hello

[root@localhost work]# time ./hello

hello world!

real? 0m0.011s

user 0m0.000s

sys?? 0m0.002s

//優化如下:

[root@localhost work]# gcc -Wall -O hello.c -o hello

[root@localhost work]# time ./hello

?

[root@localhost work]# gcc -Wall -O1 hello.c -o hello

[root@localhost work]# time ./hello

?

[root@localhost work]# gcc -Wall -O2 hello.c -o hello

[root@localhost work]# time ./hello

?

[root@localhost work]# gcc -Wall -O3 hello.c -o hello

[root@localhost work]# time ./hello

real:進程總的執行時間,它和系統負載有關(包括了進程調度,切換的時間)

user:被測量的進程中用戶指令的執行時間(CPU的運行,計算等)

sys:被測量的進程中內核代用戶指令執行的時間,user和sys的和被稱為CPU時間(系統調用消耗的時間)。

注意:盡管gcc的代碼優化功能很強大,但還是要求能夠手工編寫出高質量的代碼(很重要),如果自己編寫的代碼簡潔,邏輯性強,則編譯器就不會做更多的工作,甚至不需要進行優化。而且在一些場合中不允許對代碼進行優化:程序開發的時候,優化等級越高,消耗在編譯的時間上也就越長,因此開發的時候不建議對代碼進行優化,只有軟件開發結束的時候,才考慮對最終代碼進行優化。跟蹤調試的時候,也不建議對代碼進行優化,因為優化可能會使某些代碼被刪除或改寫,或者重組,從而使跟蹤和調試變得異常困難。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385444.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gcc編譯多個源代碼文件的過程(引出makefile)

由foo1.c foo2.c foo3.c 3個源文件組成的源程序生成最終的可執行程序foo的命令: gcc foo1.c foo2.c foo3.c -o foo 如果處理的源文件不止一個,則gcc會依次對每個文件進行預處理、編譯、匯編,最后將所有的目標代碼和庫文件進行,鏈…

觀擦者模式

/********************************************************************created: 2006/07/20filename: Observer.hauthor: 李創http://www.cppblog.com/converse/purpose: Observer模式的演示代碼 *********************************************************************/…

程序的裝入和鏈接

注:這是本人學習湯小丹等編寫的計算機操作系統(西安電子科技大學出版社)的學習筆記,因此許多引用來源于此書,在正文中就不注明了! 程序在運行前需要經過以下步驟:編譯程序對源程序進行編譯生成…

內存對齊

1. 對齊原則: 數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以后每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。結構(或…

1006. 換個格式輸出整數 (15)

讓我們用字母B來表示“百”、字母S表示“十”&#xff0c;用“12...n”來表示個位數字n&#xff08;<10&#xff09;&#xff0c;換個格式來輸出任一個不超過3位的正整數。例如234應該被輸出為BBSSS1234&#xff0c;因為它有2個“百”、3個“十”、以及個位的4。 輸入格式&a…

靜態庫的制作和使用

Linux下的靜態庫為lib*.a格式的二進制文件&#xff08;目標文件&#xff09;&#xff0c;對應于Windows下的.lib格式的文件。 &#xff08;1&#xff09;命名規則 lib庫名字 .a libMytest.a &#xff0c;則庫名字為mytest。下面以具體的代碼為例介紹如何制作靜態庫。 //mai…

IO多路復用之select

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 分析&#xff1a; nfds: 監控的文件描述符集里最大文件描述符加1&#xff0c;因為此參數會告訴內核檢測前多少個文件描述符的狀態 readfds&#xff1a; …

1031. 查驗身份證(15)

一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下&#xff1a; 首先對前17位數字加權求和&#xff0c;權重分配為&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0c;1&…

虛擬地址空間

對于每一個進程都會對應一個虛擬地址空間&#xff0c;對于32位的操作系統&#xff08;其指令的位數最大為32位&#xff0c;因此地址碼最多32位&#xff09;&#xff0c;虛擬地址空間的大小為B即0~4GB的虛擬地址空間&#xff0c;其中內核空間為1GB&#xff0c;如下所示&#xff…

Leecode 69. x 的平方根

實現 int sqrt(int x) 函數。 計算并返回 x 的平方根&#xff0c;其中 x 是非負整數。 由于返回類型是整數&#xff0c;結果只保留整數的部分&#xff0c;小數部分將被舍去。 示例 1: 輸入: 4 輸出: 2 示例 2: 輸入: 8 輸出: 2 說明: 8 的平方根是 2.82842..., 由于返回類…

1002. 寫出這個數 (20)

讀入一個自然數n&#xff0c;計算其各位數字之和&#xff0c;用漢語拼音寫出和的每一位數字。 輸入格式&#xff1a;每個測試輸入包含1個測試用例&#xff0c;即給出自然數n的值。這里保證n小于10100。 輸出格式&#xff1a;在一行內輸出n的各位數字之和的每一位&#xff0c;拼…

C/C++中NULL指針

先談一下C/C的強制類型轉換Type cast。與強制類型轉換相對應的是自動類型轉換。或者強制類型轉換叫顯示類型轉換&#xff0c;自動類型轉換叫隱式類型轉換。自動類型轉換會在賦值運算、混合運算、參數傳遞、返回函數返回值、格式化輸出時且當類型出現不一致時發生&#xff0c;轉…

1009. 說反話 (20)

給定一句英語&#xff0c;要求你編寫程序&#xff0c;將句中所有單詞的順序顛倒輸出。 輸入格式&#xff1a;測試輸入包含一個測試用例&#xff0c;在一行內給出總長度不超過80的字符串。字符串由若干單詞和若干空格組成&#xff0c;其中單詞是由英文字母&#xff08;大小寫有區…

動態庫(共享庫)的制作和使用

Linux下的動態庫為lib*.so格式的二進制文件&#xff08;目標文件&#xff09;&#xff0c;對應于Windows下的.dll格式的文件。 &#xff08;1&#xff09;命名規則 lib庫名.so &#xff08;2&#xff09;動態庫的制作 1&#xff09;生成與位置無關的代碼&#xff08;.o&…

孤兒進程、僵尸進進程

一、兒進程與僵尸進程 1、基本概念 我們知道在unix/linux中&#xff0c;正常情況下&#xff0c;子進程是通過父進程創建的&#xff0c;子進程在創建新的進程。子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程 到底什么時候結束。 當一個 進程完成它的工…

管道 -pipe

gcc編譯器將源代碼編譯成可執行程序的過程中&#xff0c;需要經過許多中間步驟&#xff08;預處理、編譯、匯編、鏈接&#xff09;&#xff0c;這些過程實際上是由不同的程序來負責完成的&#xff08;/usr/bin/gcc、cpp、ccl、as和ld等&#xff09;。在這個過程的每一個階段中&…

gdb調試器(一)

在默認情況下&#xff0c;gcc在編譯時不會把調試符號插入到最終生成的二進制代碼&#xff08;機器代碼&#xff09;中&#xff0c;因為這樣會急劇增加可執行程序的大小。如果需要在編譯時生成調試符號的信息&#xff0c;則可以采用-g或-ggdb參數。 gcc在產生調試信息時&#x…

1048. 數字加密(20)

本題要求實現一種數字加密方法。首先固定一個加密用正整數A&#xff0c;對任一正整數B&#xff0c;將其每1位數字與A的對應位置上的數字進行以下運算&#xff1a;對奇數位&#xff0c;對應位的數字相加后對13取余——這里用J代表10、Q代表11、K代表12&#xff1b;對偶數位&…

網絡編程套接字API

uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);int inet_pton(int family, const char *strptr, void *addrptr); 分析&#xff1a; 第一個參數可以是AF_INET或AF_INET6&am…

gdb調試器(二)

Linux下的gdb&#xff08;GNU Debugger&#xff09;是一個用來調試C、C程序的調試器&#xff08;命令行方式的調試器&#xff09;&#xff0c;能夠在程序運行期間觀察程序的內部結構和內存的使用情況。程序員也可以使用gdb來跟蹤程序中的錯誤&#xff0c;從而減少程序員的工作量…