奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語(yǔ)言

嵌入式C語(yǔ)言優(yōu)化小技巧

時(shí)間:2025-04-12 23:38:47 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

嵌入式C語(yǔ)言優(yōu)化小技巧

  C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。下面小編整理了嵌入式C語(yǔ)言優(yōu)化技巧,希望對(duì)大家有幫助!

  1、嵌入式C語(yǔ)言的特點(diǎn)

  作為一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,C 語(yǔ)言兼顧多種高級(jí)語(yǔ)言的特點(diǎn),具有很強(qiáng)的功能性和可移植性。但在嵌入式系統(tǒng)開(kāi)發(fā)中,出于對(duì)低價(jià)產(chǎn)品的需求,系統(tǒng)的計(jì)算能力和存儲(chǔ)容量都非常有限,因此如何利用好這些資源就顯得十分重要。開(kāi)發(fā)人員應(yīng)注意嵌入式 C語(yǔ)言和標(biāo)準(zhǔn) C 語(yǔ)言的區(qū)別,減少生成代碼長(zhǎng)度,提高程序執(zhí)行效率,在程序設(shè)計(jì)中對(duì)代碼進(jìn)行優(yōu)化。

  2、C代碼在程序中的優(yōu)化

  現(xiàn)在的 C 編譯器會(huì)自動(dòng)對(duì)代碼進(jìn)行優(yōu)化,但這些優(yōu)化是對(duì)執(zhí)行速度和代碼長(zhǎng)度的平衡。如果要獲得更小且執(zhí)行效率更高的代碼,需要程序員手工對(duì)代碼進(jìn)行優(yōu)化。

  3、變量類(lèi)型的定義

  不同的數(shù)據(jù)類(lèi)型所生成的機(jī)器代碼長(zhǎng)度相差很多,變量類(lèi)型選取的范圍越小運(yùn)行速度越快,占用的內(nèi)存越少。能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來(lái)定義;能夠使用整型變量定義的變量就不要用長(zhǎng)整型(long int),能不使用浮點(diǎn)型(float)變量就不要使用浮點(diǎn)型變量。相同類(lèi)型的數(shù)據(jù)類(lèi)型,有無(wú)符號(hào)對(duì)機(jī)器代碼長(zhǎng)度也有影響。因此我們應(yīng)按照實(shí)際需要合理的選用數(shù)據(jù)類(lèi)型。當(dāng)然,在定義變量后不要超過(guò)變量的作用范圍,如果超過(guò)變量的范圍賦值,C編譯器并不報(bào)錯(cuò),但程序運(yùn)行結(jié)果卻錯(cuò)了,而且這樣的錯(cuò)誤很難發(fā)現(xiàn)。

  4、算法優(yōu)化

  算法優(yōu)化指對(duì)程序時(shí)空復(fù)雜度的優(yōu)化:在 PC 機(jī)上進(jìn)行程序設(shè)計(jì)時(shí)一般不必過(guò)多關(guān)注程序代碼的長(zhǎng)短,只需考慮功能的實(shí)現(xiàn),但嵌入式系統(tǒng)就必須考慮系統(tǒng)的硬件資源,在程序設(shè)計(jì)時(shí),應(yīng)盡量采用生成代碼短的算法,在不影響程序功能實(shí)現(xiàn)的情況下優(yōu)化算法。

  5、適當(dāng)?shù)氖褂煤?/strong>

  在C程序中使用宏代碼可以提高程序的執(zhí)行效率。宏代碼本身不是函數(shù),但使用起來(lái)像函數(shù)。函數(shù)調(diào)用要使用系統(tǒng)的棧來(lái)保存數(shù)據(jù),同時(shí) CPU 在函數(shù)調(diào)用時(shí)需要保存和恢復(fù)當(dāng)前的現(xiàn)場(chǎng),進(jìn)行進(jìn)棧和出棧操作,所以函數(shù)調(diào)用也需要 CPU時(shí)間。而宏定義就沒(méi)有這個(gè)問(wèn)題:宏定義僅僅作為預(yù)先寫(xiě)好的代碼嵌入到當(dāng)前程序中,不產(chǎn)生函數(shù)調(diào)用,所占用的僅僅是一些空間,省去了參數(shù)壓棧,生成匯編語(yǔ)言的 call 調(diào)用,返回參數(shù),執(zhí)行 return等過(guò)程,從而提高了程序的執(zhí)行速度。雖然宏破壞了程序的可讀性,使排錯(cuò)更加麻煩,但對(duì)于嵌入式系統(tǒng),為了達(dá)到要求的性能,嵌入代碼常常是必須的做法。

  此外,我們還要避免不必要的函數(shù)調(diào)用,請(qǐng)看下面的代碼:

  [plain] view plain copy print?

  void str_print( char *str )

  {

  int i;

  for ( i = 0; i < strlen ( str ); i++ )

  {

  printf("%c",str[ i ] );

  }

  }

  void str_print1 ( char *str )

  {

  int len;

  len = strlen ( str );

  for ( i = 0; i < len; i++ )

  {

  printf("%c",str[ i ] );

  }

  }

  請(qǐng)注意,這兩個(gè)函數(shù)的功能相似。然而,第一個(gè)函數(shù)調(diào)用strlen函數(shù)多次,而第二個(gè)函數(shù)只調(diào)用函數(shù)strlen一次。因此第二個(gè)函數(shù)性能明顯比第一個(gè)好。

  6、內(nèi)嵌匯編

  程序中對(duì)時(shí)間要求苛刻的部分可以用內(nèi)嵌匯編來(lái)重寫(xiě),以帶來(lái)速度上的顯著提高。但是,開(kāi)發(fā)和測(cè)試匯編代碼是一件辛苦的工作,它將花費(fèi)更長(zhǎng)的時(shí)間,因而要慎重選擇要用匯編的部分。在程序中,存在一個(gè)80-20原則,即20%的程序消耗了80%的運(yùn)行時(shí)間,因而我們要改進(jìn)效率,最主要是考慮改進(jìn)那20%的代碼。

  7、提高循環(huán)語(yǔ)言的效率

  在 C 語(yǔ)言中循環(huán)語(yǔ)句使用頻繁,提高循環(huán)體效率的基本辦法就是降低循環(huán)體的復(fù)雜性:

  (1) 在多重循環(huán)中,應(yīng)將最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層。這樣可以減少 CPU跨切循環(huán)的次數(shù)。如例 1-1 的效率比 1-2 的效率要低:

  [plain] view plain copy print?

  for (j = 0; j < 30; j++)

  {

  for (i = 0; i < 10; i++)

  {……}

  } // 例子 1-1

  for (i = 0; i < 10; i++)

  {

  for (j = 0; j < 30; j++)

  {……}

  } // 例子 2-2 程序部簡(jiǎn)潔但效率高

  8、提高 switch 語(yǔ)句的效率

  switch 語(yǔ)句是 C 語(yǔ)言中常用的選擇語(yǔ)句, 在編譯時(shí)會(huì)產(chǎn)生if- else- if 嵌套代碼,并按照順序進(jìn)行比較,發(fā)現(xiàn)匹配時(shí),就跳轉(zhuǎn)到滿足條件的語(yǔ)句執(zhí)行。

  當(dāng) switch 語(yǔ)句中的 case 標(biāo)號(hào)很多時(shí),為了減少比較的次數(shù),可以把發(fā)生頻率相對(duì)高的條件放到第一位或者把整個(gè) switch 語(yǔ)句轉(zhuǎn)化嵌套 switch 語(yǔ)句。把發(fā)生頻率高的 case 標(biāo)號(hào)放在最外層的 switch 語(yǔ)句中,發(fā)生相對(duì)頻率相對(duì)低的 case 標(biāo)號(hào)放在另外的 switch 語(yǔ)句中。如例 3 中,把發(fā)生率高的case 標(biāo)號(hào)放在外層的 switch 語(yǔ)句中,把發(fā)生頻率低的放在缺省的(default)內(nèi)層 switch 語(yǔ)句中。

  [plain] view plain copy print?

  switch (表達(dá)式)

  {

  case 值1:

  語(yǔ)句1: break;

  case 值2:

  語(yǔ)句2:break;

  ……

  /*把發(fā)生頻率低的放在內(nèi)層的switch語(yǔ)句中*/

  default:

  switch (表達(dá)式)

  {

  case 值n:

  語(yǔ)句n: break;

  case 值m:

  語(yǔ)句m: break;

  ……

  }

  }

  例子3 使用嵌套switch語(yǔ)句提高程序執(zhí)行效率。

  9、避免使用標(biāo)準(zhǔn)庫(kù)

  使用 C語(yǔ)言標(biāo)準(zhǔn)庫(kù)可以加快開(kāi)發(fā)進(jìn)度,但由于標(biāo)準(zhǔn)庫(kù)需要設(shè)法處理用戶所有可能遇到的情況,所以很多標(biāo)準(zhǔn)庫(kù)代碼很大。比如標(biāo)準(zhǔn)庫(kù)中的 sprintf函數(shù)非常大。這個(gè)龐大的代碼中有很大一部分用于處理浮點(diǎn)數(shù),如果程序中不需要格式化浮點(diǎn)數(shù)值( 如%f),程序設(shè)計(jì)人員就可以根據(jù)實(shí)際情況用少量的代碼實(shí)現(xiàn)這個(gè)功能。

  10、采用數(shù)學(xué)方法優(yōu)化程序

  數(shù)學(xué)是計(jì)算機(jī)之母,沒(méi)有數(shù)學(xué)的依據(jù)和基礎(chǔ),就沒(méi)有計(jì)算機(jī)的發(fā)展,所以在編寫(xiě)程序的時(shí)候,采用一些數(shù)學(xué)方法會(huì)對(duì)程序的執(zhí)行效率有數(shù)量級(jí)的提高。有時(shí)候這個(gè)問(wèn)題常常被大家忽略, 對(duì)于沒(méi)有經(jīng)驗(yàn)的程序員來(lái)說(shuō)更是如此。例如:求 1~100 的和:

  sum = 100*(100+1)/2;

  數(shù)學(xué)公式: (a1 + an)*n/2

  使用C語(yǔ)言的位操作可以減少除法和取模的運(yùn)算。在計(jì)算機(jī)程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用“位運(yùn)算”來(lái)完成所有的運(yùn)算和操作。因而,靈活的位操作可以有效地提高程序運(yùn)行的效率。比如用用位操作區(qū)代替除法:比如:128 / 8 ->> 128 >> 3;

  優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu)對(duì)提高代碼的效率有很大的幫助。當(dāng)然有時(shí)候時(shí)間效率和空間效率是對(duì)立的,此時(shí)應(yīng)分析哪個(gè)更重要, 做出適當(dāng)?shù)恼壑。另外,在進(jìn)行優(yōu)化的時(shí)候不要片面的追求緊湊的代碼,因?yàn)榫o湊的代碼并不能產(chǎn)生高效率的機(jī)器碼。

  11、存儲(chǔ)器分配

  由于成本限制,嵌入式系統(tǒng)存儲(chǔ)器容量有限。程序中所有的變量,包含的庫(kù)函數(shù)以及堆棧等都使用有限的內(nèi)存:全局變量在整個(gè)程序范圍內(nèi)都有效。程序執(zhí)行完后才會(huì)釋放;靜態(tài)變量的作用范圍也是整個(gè)程序,只有局部變量中的動(dòng)態(tài)變量在函數(shù)執(zhí)行完后會(huì)釋放。因此, 在程序中應(yīng)盡量使用局部變量,提高內(nèi)存使用效率。程序中堆的大小受限于所有全局?jǐn)?shù)據(jù)和?臻g都分配后的剩余量,如果堆太小,程序不能夠在需要的時(shí)候分配內(nèi)存。因此在使用 malloc 函數(shù)申請(qǐng)內(nèi)存之后一定要用 free 函數(shù)進(jìn)行釋放, 防止內(nèi)存泄露。

  12、選擇好的無(wú)限循環(huán)

  在編程中,我們常常需要用到無(wú)限循環(huán),常用的兩種方法是while (1) 和 for (;;)。這兩種方法效果完全一樣,但那一種更好呢?然我們看看它們編譯后的代碼:

  編譯前:

  while (1);

  編譯后:

  mov eax,1

  test eax,eax

  je foo+23h

  jmp foo+18h

  編譯前:

  for (;;);

  編譯后:

  jmp foo+23h

  顯然,for (;;)指令少,不占用寄存器,而且沒(méi)有判斷,跳轉(zhuǎn),比while (1)好。

  13、使用Memoization,以避免遞歸重復(fù)計(jì)算

  考慮Fibonacci(斐波那契)問(wèn)題,F(xiàn)ibonacci問(wèn)題是可以通過(guò)簡(jiǎn)單的遞歸方法來(lái)解決:

  [plain] view plain copy print?

  1. int fib ( n )

  2. {

  3. if ( n == 0 || n == 1 )

  4. {

  5. return 1;

  6. }

  7. else

  8. {

  9. return fib( n - 2 ) + fib ( n - 1 );

  10. }

  11. }

  注:在這里,我們考慮Fibonacci 系列從1開(kāi)始,因此,該系列看起來(lái):1,1,2,3,5,8,…

  注意:從遞歸樹(shù),我們計(jì)算fib(3)函數(shù)2次,fib(2)函數(shù)3次。這是相同函數(shù)的重復(fù)計(jì)算。如果n非常大,fib函數(shù)的效率會(huì)比較低。Memoization是一個(gè)簡(jiǎn)單的技術(shù),可以被用在遞歸,加強(qiáng)計(jì)算速度。fibonacci 函數(shù)Memoization的代碼如下:

  [plain] view plain copy print?

  1. int calc_fib ( int n )

  2. {

  3. int val[ n ] , i;

  4. for ( i = 0; i <=n; i++ )

  5. {

  6. val[ i ] = -1; // Value of the first n + 1 terms of the fibonacci terms set to -1

  7. }

  8. val[ 0 ] = 1; // Value of fib ( 0 ) is set to 1

  9. val[ 1 ] = 1; // Value of fib ( 1 ) is set to 1

  10. return fib( n , val );

  11. }

  12.

  13. int fib( int n , int* value )

  14. {

  15. if ( value[ n ] != -1 )

  16. {

  17. return value[ n ]; // Using memoization

  18. }

  19. else

  20. {

  21. value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value ); // Computing the fibonacci term

  22. }

  23. return value[ n ]; // Returning the value

  24. }

  除了編程上的技巧外,為提高系統(tǒng)的運(yùn)行效率,我們通常也需要最大可能地利用各種硬件設(shè)備自身的特點(diǎn)來(lái)減小其運(yùn)轉(zhuǎn)開(kāi)銷(xiāo),例如減小中斷次數(shù),利用DMA傳輸方式等。


【嵌入式C語(yǔ)言優(yōu)化小技巧】相關(guān)文章:

嵌入式C語(yǔ)言優(yōu)化技巧10-27

C語(yǔ)言優(yōu)化小技巧10-04

嵌入式C語(yǔ)言性能優(yōu)化方法10-22

嵌入式C語(yǔ)言內(nèi)存操作技巧07-25

嵌入式C語(yǔ)言編程小知識(shí)12-20

C語(yǔ)言嵌入式編程小知識(shí)08-30

嵌入式c語(yǔ)言調(diào)試開(kāi)關(guān)的技巧10-21

嵌入式C語(yǔ)言編程小知識(shí)總結(jié)08-12

C語(yǔ)言高效編程的小技巧09-13

主站蜘蛛池模板: 金阳县| 寻乌县| 金昌市| 西青区| 九龙县| 宁河县| 桂阳县| 道孚县| 固阳县| 张北县| 阿图什市| 中山市| 佛学| 上饶县| 游戏| 进贤县| 桑日县| 稷山县| 灵川县| 玛纳斯县| 霸州市| 平潭县| 北流市| 英吉沙县| 锦州市| 定陶县| 达州市| 甘德县| 无棣县| 海原县| 隆化县| 同江市| 永安市| 休宁县| 鹤峰县| 乐业县| 湘阴县| 辉县市| 绍兴县| 淳安县| 三门县|