當前位置:首頁 » 編程語言 » c語言常見匯編優化效率
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言常見匯編優化效率

發布時間: 2023-01-03 16:57:08

『壹』 為什麼說匯編語言的執行效率高

呵呵,你這個問題倒是很有意思。
首先什麼是執行效率。我們平常所說的執行效率就是使用相同的演算法在相同輸入條件下完成相同計算所產生的系統開銷,目前來說一般會更多關注執行時間方面的開銷。
你說的是沒錯,所有語言編寫的代碼最終要運行,都要轉化成機器碼。但是,由於這個「轉化」所採用的方法不同,其所需要消耗的時間也使不同的。
具個簡單的例子來說,比如把一個變數的值自加1,並執行100次,也就是下面這條語句:
for(i=0;i<100;)
{
i++;
}
那麼對於一個沒有充分優化的c語言編譯器而言,你需要每次定址內存找到變數,然後把變數值拷貝到寄存器,然後對寄存器自加1,然後把寄存器值寫回到內存,整個過程需要反復執行100次。
但是如果你寫匯編代碼,那就沒這么麻煩了,你只需要定址內存一次,把變數讀入寄存器,然後對寄存器自加100次,最後寫回內存即可。你可以想見,這個匯編代碼的執行速度要比C語言快得多,但它們所執行的功能是一樣的。
當然,我前面這個例子只是用來說明問題,並不具有實踐價值。實踐中有很多因素影響程序的效率,例如編譯方式、優化程度等等。而這些與程序員的素質也有關系,一個差的匯編程序很可能不如一個好的C語言程序執行效率高。

『貳』 對DSP而言,CCS用C語言編程和匯編編程,二者的效率相差多少

我用的是28XX系列的,不知道經驗對你有沒有用,因為不同系列的晶元多少有些差別。
TI提供的庫已經相當可以了,兼顧易用與效率。我當時做過這樣的測試
1. 用IQMATH實現
2. 直接C語言實現
3. C語言優化實現
4. 原生匯編實現
IQMATH的運行周期在1000左右,比方案3快幾十個周期,比方案4慢幾個周期,方案2是10000多個周期。
另外,因為只是單獨測的演算法,匯編之所以快是快在寄存器的使用上,操作數可以直接入寄存器,但是考慮到程序其他部分是用C語言編寫的話,把操作棧的時間也加上,並不比方案1快。畢竟我對TI的匯編吃的也不透。
在編寫上,無疑是方案1提供了最接近C語言風格的實現,幾乎不用考慮ISA方面的問題。
另外對於執行效率,我覺得主要考慮三點:
1.分支的使用
CCS對C語言的優化我沒做過太多比對。其實單從反匯編的結果看,我接觸過的嵌入式開發環境的編譯器都能做出很好的優化。但是幾乎每個編譯器都會在邏輯的優化上有欠缺——它只能對一些顯而易見的判斷條件進行優化,而在寫程序的過程中,我們經常出於易讀性的考慮,或者穩定性的考慮,或者其他的考慮加入幾乎不會發生的分支,這樣的分支判斷會消耗一定比率的代碼段執行效率,視乎代碼段內有用功能的長度而定,越長這個比率越小,越短這個比率越高。
2.一般操作,就是各種賦值操作
在一般的操作上,編譯器的優化已經很令人滿意了,基本上可以作為編寫匯編的範本。我覺得所謂效率能達到90%就是針對這個部分說的。
3.特殊操作,比如對整塊內存的操作,或者是浮點運算上。
在一些特殊的操作上,就要看是否有現成的庫,或者看硬體是否支持。比如對整塊內存操作就別用循環一個位元組一個位元組的搬了。
以上三點都能考慮到的話,相信執行效率方面已經沒有太大的提升空間了。

另外如果你的代碼發生在初始化部分,也就是只在系統運行開始的時候運行一次,那麼優化不優化其實沒有太大的必要,除非你對系統初始化的時間有嚴格的要求。但是如果你的代碼是作為任務要被反復運行的,那就有優化的必要了。

在CCS里有代碼消耗時鍾周期的統計,如果你覺得某段代碼效率低下的話,可以先分段進行消耗時鍾周期的計算,這樣優化比較有針對性。

『叄』 c語言和匯編混編,效率如何

就是常說的混合編程唄,除了純匯編以外效率最高的方式.

優點在於匯編可以彌補C語言的一些瓶頸,從而提高效率,如C中的循環就是反復賦值的過程,這是一個瓶頸無法解決,但是這地方若要用匯編代碼彌補,就大大提高了效率.

缺點在於不宜編寫,本來編寫C就需要很小心,還要在准確的加入匯編,對各個寄存器的現場保護與恢復很費腦筋.

一般來說,最好的C程序員都是由寫匯編出身轉成C的人.匯編是從基本上了解編程思想.如果你時間充裕,強烈建議從匯編入手.

『肆』 關於匯編和c語言效率哪個高

當然是匯編語言效率高:
高級語言一般都是被編譯程序編譯成 匯編代碼,然後再轉換成機器碼.
匯編語言直接被編譯成機器碼.
如果樓主學了匯編語言就知道了,匯編語言更靠近硬體,是做病毒的好東西!

『伍』 c語言效率問題

匯編語言的效率確實比C語言高,但匯編語言調試過程較為困難,代碼容易遺留缺陷,而且難以維護。其實編譯器已經把你這個想法幹掉了,C編譯器會把C代碼轉換成匯編代碼,再翻譯成機器指令。如果想獲得較高的效率,可在編譯前,將編譯器的優化選項打開,如此即可獲得較高效率的代碼。如果這樣得到的代碼還是不能滿足要求,那麼合適的做法是識別程序中對效率要求最高的一小部分,將這小部分代碼用匯編實現,並將代碼嵌入到C程序中。

『陸』 幾種C語言優化代碼技巧

以下內容摘自李亞鋒先生的《經典C面試真題精講》
1.結構體設計為成員最長類型長度的整數倍;
2.減少函數參數的個數,不需要返回值的函數定義為void類型;
3.if...else....多條件分支語句中,把出現頻率高的條件放在前面;
4.同時聲明多個相同類型變數優於分別單獨聲明變數;
5.減少定義全局變數;
6.使用#define定義常量和小的函數實現;
7.有些情況嵌套匯編語句效率更高;
8.佔用大的存儲空間可以減少執行時間,同理時間也可以換取空間;
9提高程序演算法效率;

『柒』 win32匯編與C語言哪個效率高

當然是匯編語言效率高。
常說匯編語言過時,是低級語言,並不是說匯編語言要被棄之,相反,匯編語言仍然是程序員必須了解的語言,在某些行業與領域,匯編是必不可少的,非它不可適用。只是,現在計算機最大的領域為IT軟體,也是我們常說的 Windows 編程,在熟練的程序員手裡,使用匯編語言編寫的程序,運行效率與性能比其它語言寫的程序是成倍的優秀,但是代價是需要更長的時間來優化,如果對計算機原理及編程基礎不扎實,實在是得不償失,對比現在的軟體開發,已經是市場化的軟體行業,加上高級語言的優秀與跨平台,一個公司不可以讓一個團隊使用匯編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,只要最終結果不比匯編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。
一個電子工程師,主要開發語言就是匯編,c語言使用只佔極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程序員的十倍以上。這種情況是因為現在學習匯編的人雖然也不少,但是真正能學到精通的卻不多,它難學,難用,適用范圍小,雖然簡單,但是過於靈活,學習過高級語言的人去學習匯編比一開始學匯編的人難得多,但是學過匯編的人學習高級語言卻很容易,簡從繁易,繁從簡難。

『捌』 一個關於C語言語句用匯編優化的問題:

生成的匯編已經夠精簡了,看起來你是在一個雙重循環中使用了這句
內聯匯編應該解決不了這里的效率問題,可以嘗試修改你這段代碼,比如,內層的循環,那個指針沒必要重復計算和載入
double temp1,temp2;

for(int j=0; j < MMM; j++)
{
double *dbp = hpdf->b[j]->var->vec;
for(int i=0;i <NNN;i++)
temp2+=temp1*temp1*dbp[i];
}
又比如,temp1的平方如果是在外層就可以計算的,也沒必要在內層循環計算

這只是個修改的思路,你再看編譯出來的代碼情況