97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

網(wǎng)站建設(shè)與管理自考本制作個(gè)人網(wǎng)站的要求

鶴壁市浩天電氣有限公司 2026/01/24 12:20:51
網(wǎng)站建設(shè)與管理自考本,制作個(gè)人網(wǎng)站的要求,wordpress 相關(guān)文章 圖片,網(wǎng)站建設(shè)費(fèi)用選網(wǎng)絡(luò)專業(yè)1 選擇合適的算法和數(shù)據(jù)結(jié)構(gòu) 選擇一種合適的數(shù)據(jù)結(jié)構(gòu)很重要#xff0c;如果在一堆隨機(jī)存放的數(shù)中使用了大量的插入和刪除指令#xff0c;那使用鏈表要快得多。數(shù)組與指針語(yǔ)句具有十分密切的關(guān)系#xff0c;一般來(lái)說(shuō)#xff0c;指針比較靈活簡(jiǎn)潔#xff0c;而數(shù)組則比較…1 選擇合適的算法和數(shù)據(jù)結(jié)構(gòu)選擇一種合適的數(shù)據(jù)結(jié)構(gòu)很重要如果在一堆隨機(jī)存放的數(shù)中使用了大量的插入和刪除指令那使用鏈表要快得多。數(shù)組與指針語(yǔ)句具有十分密切的關(guān)系一般來(lái)說(shuō)指針比較靈活簡(jiǎn)潔而數(shù)組則比較直觀容易理解。對(duì)于大部分的編譯器使用指針比使用數(shù)組生成的代碼更短執(zhí)行效率更高。在許多種情況下可以用指針運(yùn)算代替數(shù)組索引這樣做常常能產(chǎn)生又快又短的代碼。與數(shù)組索引相比指針一般能使代碼速度更快占用空間更少。使用多維數(shù)組時(shí)差異更明顯。下面的代碼(代碼不完整只是為了做示例分析)作用是相同的但是效率不一樣。// 示例代碼1數(shù)組索引for(;;){ a array[t]; } // 示例代碼2指針運(yùn)算p array;for(;;){ a *(p);}指針方法的優(yōu)點(diǎn)是數(shù)組array的地址裝入地址p后在每次循環(huán)中只需對(duì)p增量操作。在數(shù)組索引方法中每次循環(huán)中都必須根據(jù)t值求數(shù)組下標(biāo)的復(fù)雜運(yùn)算。2 減少運(yùn)算的強(qiáng)度(1)查表(游戲程序員必修課)一個(gè)聰明的游戲大蝦基本上不會(huì)在自己的主循環(huán)里搞什么運(yùn)算工作絕對(duì)是先計(jì)算好了再到循環(huán)里查表??聪旅娴睦优f代碼long factorial(int i){if (i 0)return 1;elsereturn i * factorial(i - 1);}新代碼static long factorial_table[] {112624120720 /* etc */};long factorial(int i){return factorial_table[i];}如果表很大不好寫就寫一個(gè)init函數(shù)在循環(huán)外臨時(shí)生成表格。(2)求余運(yùn)算a a%8;可以改為a a7;說(shuō)明位操作只需一個(gè)指令周期即可完成而大部分的C編譯器的“%”運(yùn)算均是調(diào)用子程序來(lái)完成代碼長(zhǎng)、執(zhí)行速度慢。通常只要求是求2n方的余數(shù)均可使用位操作的方法來(lái)代替。(3)平方運(yùn)算a pow(a, 2.0);可以改為a a*a;說(shuō)明在有內(nèi)置硬件乘法器的單片機(jī)中(如51系列)乘法運(yùn)算比求平方運(yùn)算快得多因?yàn)楦↑c(diǎn)數(shù)的求平方是通過(guò)調(diào)用子程序來(lái)實(shí)現(xiàn)的在自帶硬件乘法器的AVR單片機(jī)中如ATMega163中乘法運(yùn)算只需2個(gè)時(shí)鐘周期就可以完成。既使是在沒有內(nèi)置硬件乘法器的AVR單片機(jī)中乘法運(yùn)算的子程序比平方運(yùn)算的子程序代碼短執(zhí)行速度快。如果是求3次方如apow(a3.0);更改為a a*a*a;則效率的改善更明顯。(4)用移位實(shí)現(xiàn)乘除法運(yùn)算a a*4;b b/4;可以改為a a 2;b b 2;通常如果需要乘以或除以2n都可以用移位的方法代替。在ICCAVR中如果乘以2n都可以生成左移的代碼而乘以其它的整數(shù)或除以任何數(shù)均調(diào)用乘除法子程序。用移位的方法得到代碼比調(diào)用乘除法子程序生成的代碼效率高。實(shí)際上只要是乘以或除以一個(gè)整數(shù)均可以用移位的方法得到結(jié)果如a a*9可以改為a (a 3) a采用運(yùn)算量更小的表達(dá)式替換原來(lái)的表達(dá)式下面是一個(gè)經(jīng)典例子:舊代碼:x w % 8;y pow(x, 2.0);z y * 33;for (i 0; i MAX; i ){ h 14 * i; printf(%dh);}新代碼x w 7; /*位操作比求余運(yùn)算快*/y x * x; /*乘法比平方運(yùn)算快*/z (y 5) y; /*位移乘法比乘法快*/for (i h 0; i MAX; i){ h 14; /*加法比乘法快*/ printf(%dh);}(5)避免不必要的整數(shù)除法整數(shù)除法是整數(shù)運(yùn)算中最慢的所以應(yīng)該盡可能避免。一種可能減少整數(shù)除法的地方是連除這里除法可以由乘法代替。這個(gè)替換的副作用是有可能在算乘積時(shí)會(huì)溢出所以只能在一定范圍的除法中使用。不好的代碼int i, j, k, mm i / j / k推薦的代碼int ijkmm i / (j * k)(6)使用增量和減量操作符在使用到加一和減一操作時(shí)盡量使用增量和減量操作符因?yàn)樵隽糠Z(yǔ)句比賦值語(yǔ)句更快原因在于對(duì)大多數(shù)CPU來(lái)說(shuō)對(duì)內(nèi)存字的增、減量操作不必明顯地使用取內(nèi)存和寫內(nèi)存的指令比如下面這條語(yǔ)句x x1;模仿大多數(shù)微機(jī)匯編語(yǔ)言為例產(chǎn)生的代碼類似于move Ax ;把x從內(nèi)存取出存入累加器Aadd A1 ;累加器A加1store x ;把新值存回x如果使用增量操作符生成的代碼如下incr x ;x加1顯然不用取指令和存指令增、減量操作執(zhí)行的速度加快同時(shí)長(zhǎng)度也縮短了。(7)使用復(fù)合賦值表達(dá)式復(fù)合賦值表達(dá)式(如a-1及a1等)都能夠生成高質(zhì)量的程序代碼。(8)提取公共的子表達(dá)式在某些情況下C編譯器不能從浮點(diǎn)表達(dá)式中提出公共的子表達(dá)式因?yàn)檫@意味著相當(dāng)于對(duì)表達(dá)式重新排序。需要特別指出的是編譯器在提取公共子表達(dá)式前不能按照代數(shù)的等價(jià)關(guān)系重新安排表達(dá)式。這時(shí)程序員要手動(dòng)地提出公共的子表達(dá)式在VC.NET里有一項(xiàng)“全局優(yōu)化”選項(xiàng)可以完成此工作但效果就不得而知了。不好的代碼float abcdef// 。。。e b * c / df b / d * a推薦的代碼float abcdef// 。。。const float t(b / d)e c * tf a * t不好的代碼float abcef// 。。。e a / cf b / c推薦的代碼float abcef// 。。。const float t(1.0f / c)e a * tf b * t3 結(jié)構(gòu)體成員的布局很多編譯器有“使結(jié)構(gòu)體字雙字或四字對(duì)齊”的選項(xiàng)。但是還是需要改善結(jié)構(gòu)體成員的對(duì)齊有些編譯器可能分配給結(jié)構(gòu)體成員空間的順序與他們聲明的不同。但是有些編譯器并不提供這些功能或者效果不好。所以要在付出最少代價(jià)的情況下實(shí)現(xiàn)最好的結(jié)構(gòu)體和結(jié)構(gòu)體成員對(duì)齊建議采取下列方法(1)按數(shù)據(jù)類型的長(zhǎng)度排序把結(jié)構(gòu)體的成員按照它們的類型長(zhǎng)度排序聲明成員時(shí)把長(zhǎng)的類型放在短的前面。編譯器要求把長(zhǎng)型數(shù)據(jù)類型存放在偶數(shù)地址邊界。在申明一個(gè)復(fù)雜的數(shù)據(jù)類型 (既有多字節(jié)數(shù)據(jù)又有單字節(jié)數(shù)據(jù)) 時(shí)應(yīng)該首先存放多字節(jié)數(shù)據(jù)然后再存放單字節(jié)數(shù)據(jù)這樣可以避免內(nèi)存的空洞。編譯器自動(dòng)地把結(jié)構(gòu)的實(shí)例對(duì)齊在內(nèi)存的偶數(shù)邊界。(2)把結(jié)構(gòu)體填充成最長(zhǎng)類型長(zhǎng)度的整倍數(shù)把結(jié)構(gòu)體填充成最長(zhǎng)類型長(zhǎng)度的整倍數(shù)。照這樣如果結(jié)構(gòu)體的第一個(gè)成員對(duì)齊了所有整個(gè)結(jié)構(gòu)體自然也就對(duì)齊了。下面的例子演示了如何對(duì)結(jié)構(gòu)體成員進(jìn)行重新排序不好的代碼普通順序struct{ char a[5] long k double x} baz推薦的代碼新的順序并手動(dòng)填充了幾個(gè)字節(jié)struct{ double x long k char a[5] char pad[7]} baz這個(gè)規(guī)則同樣適用于類的成員的布局。(3)按數(shù)據(jù)類型的長(zhǎng)度排序本地變量當(dāng)編譯器分配給本地變量空間時(shí)它們的順序和它們?cè)谠创a中聲明的順序一樣和上一條規(guī)則一樣應(yīng)該把長(zhǎng)的變量放在短的變量前面。如果第一個(gè)變量對(duì)齊了其它變量就會(huì)連續(xù)的存放而且不用填充字節(jié)自然就會(huì)對(duì)齊。有些編譯器在分配變量時(shí)不會(huì)自動(dòng)改變變量順序有些編譯器不能產(chǎn)生4字節(jié)對(duì)齊的棧所以4字節(jié)可能不對(duì)齊。下面這個(gè)例子演示了本地變量聲明的重新排序不好的代碼普通順序:short gagugilong foobardouble xyz[3]char abfloat baz推薦的代碼改進(jìn)的順序double z[3]double xylong foobarfloat bazshort gagugi(4)把頻繁使用的指針型參數(shù)拷貝到本地變量避免在函數(shù)中頻繁使用指針型參數(shù)指向的值。因?yàn)榫幾g器不知道指針之間是否存在沖突所以指針型參數(shù)往往不能被編譯器優(yōu)化。這樣數(shù)據(jù)不能被存放在寄存器中而且明顯地占用了內(nèi)存帶寬。注意很多編譯器有“假設(shè)不沖突”優(yōu)化開關(guān)在VC里必須手動(dòng)添加編譯器命令行/Oa或/Ow這允許編譯器假設(shè)兩個(gè)不同的指針總是有不同的內(nèi)容這樣就不用把指針型參數(shù)保存到本地變量。否則請(qǐng)?jiān)诤瘮?shù)一開始把指針指向的數(shù)據(jù)保存到本地變量。如果需要的話在函數(shù)結(jié)束前拷貝回去。不好的代碼// 假設(shè) q ! rvoid isqrt(unsigned long aunsigned long* qunsigned long* r){ *q a if (a 0) { while (*q (*r a / *q)) { *q (*q *r) 1 } } *r a - *q * *q}推薦的代碼// 假設(shè) q ! r void isqrt(unsigned long aunsigned long* qunsigned long* r){ unsigned long qq rr qq a if (a 0) { while (qq (rr a / qq)) { qq (qq rr) 1 } } rr a - qq * qq *q qq *r rr}4 循環(huán)優(yōu)化(1)充分分解小的循環(huán)要充分利用CPU的指令緩存就要充分分解小的循環(huán)。特別是當(dāng)循環(huán)體本身很小的時(shí)候分解循環(huán)可以提高性能。注意:很多編譯器并不能自動(dòng)分解循環(huán)。不好的代碼// 3D轉(zhuǎn)化把矢量 V 和 4x4 矩陣 M 相乘for (i 0i 4i ){ r[i] 0 for (j 0j 4j ) { r[i] M[j][i]*V[j] }}推薦的代碼r[0] M[0][0]*V[0] M[1][0]*V[1] M[2][0]*V[2] M[3][0]*V[3]r[1] M[0][1]*V[0] M[1][1]*V[1] M[2][1]*V[2] M[3][1]*V[3]r[2] M[0][2]*V[0] M[1][2]*V[1] M[2][2]*V[2] M[3][2]*V[3]r[3] M[0][3]*V[0] M[1][3]*V[1] M[2][3]*V[2] M[3][3]*v[3](2)提取公共部分對(duì)于一些不需要循環(huán)變量參加運(yùn)算的任務(wù)可以把它們放到循環(huán)外面這里的任務(wù)包括表達(dá)式、函數(shù)的調(diào)用、指針運(yùn)算、數(shù)組訪問(wèn)等應(yīng)該將沒有必要執(zhí)行多次的操作全部集合在一起放到一個(gè)init的初始化程序中進(jìn)行。(3)延時(shí)函數(shù)通常使用的延時(shí)函數(shù)均采用自加的形式void delay(void){ unsigned int i; for (i0; i1000; i) ;}將其改為自減延時(shí)函數(shù)void delay(void){ unsigned int i; for (i1000; i0; i--) ;}兩個(gè)函數(shù)的延時(shí)效果相似但幾乎所有的C編譯對(duì)后一種函數(shù)生成的代碼均比前一種代碼少1~3個(gè)字節(jié)因?yàn)閹缀跛械腗CU均有為0轉(zhuǎn)移的指令采用后一種方式能夠生成這類指令。在使用while循環(huán)時(shí)也一樣使用自減指令控制循環(huán)會(huì)比使用自加指令控制循環(huán)生成的代碼更少1~3個(gè)字母。但是在循環(huán)中有通過(guò)循環(huán)變量 “i” 讀寫數(shù)組的指令時(shí)使用預(yù)減循環(huán)有可能使數(shù)組超界要引起注意。(4)while循環(huán)和do…while循環(huán)用while循環(huán)時(shí)有以下兩種循環(huán)形式unsigned int i 0;while(i 1000){ i ; //用戶程序}或unsigned int i 1000;do{ i --; //用戶程序}while(i 0);在這兩種循環(huán)中使用do…while循環(huán)編譯后生成的代碼的長(zhǎng)度短于while循環(huán)。(5)循環(huán)展開這是經(jīng)典的速度優(yōu)化但許多編譯程序(如gcc -funroll-loops)能自動(dòng)完成這個(gè)事所以現(xiàn)在你自己來(lái)優(yōu)化這個(gè)顯得效果不明顯。舊代碼:for (i 0; i 100; i){ do_stuff(i);}新代碼for (i 0; i 100; ){ do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i; do_stuff(i); i;}可以看出新代碼里比較指令(i 100)由100次降低為10次循環(huán)時(shí)間節(jié)約了90%。不過(guò)注意:對(duì)于中間變量或結(jié)果被更改的循環(huán)編譯程序往往拒絕展開(怕?lián)?zé)任唄)這時(shí)候就需要你自己來(lái)做展開工作了。還有一點(diǎn)請(qǐng)注意在有內(nèi)部指令cache的CPU上(如MMX芯片)因?yàn)檠h(huán)展開的代碼很大往往cache溢出這時(shí)展開的代碼會(huì)頻繁地在CPU 的cache和內(nèi)存之間調(diào)來(lái)調(diào)去又因?yàn)閏ache速度很高所以此時(shí)循環(huán)展開反而會(huì)變慢。還有就是循環(huán)展開會(huì)影響矢量運(yùn)算優(yōu)化。(6)Switch語(yǔ)句中根據(jù)發(fā)生頻率來(lái)進(jìn)行case排序switch 可能轉(zhuǎn)化成多種不同算法的代碼。其中最常見的是跳轉(zhuǎn)表和比較鏈/樹。當(dāng)switch用比較鏈的方式轉(zhuǎn)化時(shí)編譯器會(huì)產(chǎn)生if-else-if的嵌套代碼并按照順序進(jìn)行比較匹配時(shí)就跳轉(zhuǎn)到滿足條件的語(yǔ)句執(zhí)行。所以可以對(duì)case的值依照發(fā)生的可能性進(jìn)行排序把最有可能的放在第一位這樣可以提高性能。此外在case中推薦使用小的連續(xù)的整數(shù)因?yàn)樵谶@種情況下所有的編譯器都可以把switch 轉(zhuǎn)化成跳轉(zhuǎn)表。不好的代碼int days_in_monthshort_monthsnormal_monthslong_monthsswitch (days_in_month){ case 28: case 29: short_months break case 30: normal_months break case 31: long_months break default: cout month has fewer than 28 or more than 31 days endl break}推薦的代碼int days_in_monthshort_monthsnormal_monthslong_monthsswitch (days_in_month){ case 31: long_months break case 30: normal_months break case 28: case 29: short_months break default: cout month has fewer than 28 or more than 31 days endl break}(7)將大的switch語(yǔ)句轉(zhuǎn)為嵌套switch語(yǔ)句當(dāng)switch語(yǔ)句中的case標(biāo)號(hào)很多時(shí)為了減少比較的次數(shù)明智的做法是把大switch語(yǔ)句轉(zhuǎn)為嵌套switch語(yǔ)句。把發(fā)生頻率高的case 標(biāo)號(hào)放在一個(gè)switch語(yǔ)句中并且是嵌套switch語(yǔ)句的最外層發(fā)生相對(duì)頻率相對(duì)低的case標(biāo)號(hào)放在另一個(gè)switch語(yǔ)句中。比如下面的程序段把相對(duì)發(fā)生頻率低的情況放在缺省的case標(biāo)號(hào)內(nèi)。pMsgReceiveMessage();switch (pMsg-type){ case FREQUENT_MSG1: handleFrequentMsg(); break; case FREQUENT_MSG2: handleFrequentMsg2(); break; case FREQUENT_MSGn: handleFrequentMsgn(); break; default: //嵌套部分用來(lái)處理不經(jīng)常發(fā)生的消息 switch (pMsg-type) { case INFREQUENT_MSG1: handleInfrequentMsg1(); break; case INFREQUENT_MSG2: handleInfrequentMsg2(); break; case INFREQUENT_MSGm: handleInfrequentMsgm(); break; }}如果switch中每一種情況下都有很多的工作要做那么把整個(gè)switch語(yǔ)句用一個(gè)指向函數(shù)指針的表來(lái)替換會(huì)更加有效比如下面的switch語(yǔ)句有三種情況enum MsgType{Msg1 Msg2 Msg3}switch (ReceiveMessage(){ case Msg1; // 。。。。。。 case Msg2; // 。。。。。 case Msg3; // 。。。。。}為了提高執(zhí)行速度用下面這段代碼來(lái)替換這個(gè)上面的switch語(yǔ)句。/*準(zhǔn)備工作*/int handleMsg1(void);int handleMsg2(void);int handleMsg3(void);/*創(chuàng)建一個(gè)函數(shù)指針數(shù)組*/int (*MsgFunction [])() {handleMsg1handleMsg2handleMsg3};/*用下面這行更有效的代碼來(lái)替換switch語(yǔ)句*/status MsgFunction[ReceiveMessage()]();(8)循環(huán)轉(zhuǎn)置有些機(jī)器對(duì)JNZ(為0轉(zhuǎn)移)有特別的指令處理速度非??烊绻愕难h(huán)對(duì)方向不敏感可以由大向小循環(huán)。舊代碼:for (i 1; i MAX; i){ //。。。}新代碼i MAX 1;while(--i){ // 。。。}不過(guò)千萬(wàn)注意如果指針操作使用了i值這種方法可能引起指針越界的嚴(yán)重錯(cuò)誤(i MAX1;)。當(dāng)然你可以通過(guò)對(duì)i做加減運(yùn)算來(lái)糾正但是這樣就起不到加速的作用除非類似于以下情況舊代碼:char a[MAX5];for (i 1; i MAX; i){ *(ai4) 0;}新代碼i MAX1;while(--i){ *(ai4) 0;}(9)公用代碼塊一些公用處理模塊為了滿足各種不同的調(diào)用需要往往在內(nèi)部采用了大量的if-then-else結(jié)構(gòu)這樣很不好判斷語(yǔ)句如果太復(fù)雜會(huì)消耗大量的時(shí)間的應(yīng)該盡量減少公用代碼塊的使用。(任何情況下空間優(yōu)化和時(shí)間優(yōu)化都是對(duì)立的--東樓)。當(dāng)然如果僅僅是一個(gè)(3x)之類的簡(jiǎn)單判斷適當(dāng)使用一下也還是允許的。記住優(yōu)化永遠(yuǎn)是追求一種平衡而不是走極端。(10)提升循環(huán)的性能要提升循環(huán)的性能減少多余的常量計(jì)算非常有用比如不隨循環(huán)變化的計(jì)算。不好的代碼(在for()中包含不變的if())for( i 。。。) // 條件自定義{ if(CONSTANT0) { DoWork0(i)//假設(shè)這里不改變CONSTANT0的值 } else { DoWork1(i)//假設(shè)這里不改變CONSTANT0的值 }}推薦的代碼if(CONSTANT0){ for( i 。。。) { DoWork0(i) }}else{ for( i 。。。) { DoWork1(i) }}如果已經(jīng)知道if()的值這樣可以避免重復(fù)計(jì)算。雖然不好的代碼中的分支可以簡(jiǎn)單地預(yù)測(cè)但是由于推薦的代碼在進(jìn)入循環(huán)前分支已經(jīng)確定就可以減少對(duì)分支預(yù)測(cè)的依賴。(11)選擇好的無(wú)限循環(huán)在編程中我們常常需要用到無(wú)限循環(huán)常用的兩種方法是while(1)和for (;;)。這兩種方法效果完全一樣但那一種更好呢然我們看看它們編譯后的代碼編譯前while(1)編譯后mov eax1test eaxeaxje foo23hjmp foo18h編譯前for(;;)編譯后jmp foo23h顯然for(;;)指令少不占用寄存器而且沒有判斷、跳轉(zhuǎn)比while(1)好。5 提高CPU的并行性(1)使用并行代碼盡可能把長(zhǎng)的有依賴的代碼鏈分解成幾個(gè)可以在流水線執(zhí)行單元中并行執(zhí)行的沒有依賴的代碼鏈。很多高級(jí)語(yǔ)言包括C并不對(duì)產(chǎn)生的浮點(diǎn)表達(dá)式重新排序因?yàn)槟鞘且粋€(gè)相當(dāng)復(fù)雜的過(guò)程。需要注意的是重排序的代碼和原來(lái)的代碼在代碼上一致并不等價(jià)于計(jì)算結(jié)果一致因?yàn)楦↑c(diǎn)操作缺乏精確度。在一些情況下這些優(yōu)化可能導(dǎo)致意料之外的結(jié)果。幸運(yùn)的是在大部分情況下最后結(jié)果可能只有最不重要的位即最低位是錯(cuò)誤的。不好的代碼double a[100]sumint isum 0.0ffor (i0i100i)sum a[i]推薦的代碼double a[100]sum1, sum2sum3sum4sumint isum1 sum2 sum3 sum4 0.0for (i 0i 100i 4){ sum1 a[i] sum2 a[i1] sum3 a[i2] sum4 a[i3]}sum (sum4sum3)(sum1sum2)要注意的是使用4路分解是因?yàn)檫@樣使用了4段流水線浮點(diǎn)加法浮點(diǎn)加法的每一個(gè)段占用一個(gè)時(shí)鐘周期保證了最大的資源利用率。(2)避免沒有必要的讀寫依賴當(dāng)數(shù)據(jù)保存到內(nèi)存時(shí)存在讀寫依賴即數(shù)據(jù)必須在正確寫入后才能再次讀取。雖然AMD Athlon等CPU有加速讀寫依賴延遲的硬件允許在要保存的數(shù)據(jù)被寫入內(nèi)存前讀取出來(lái)但是如果避免了讀寫依賴并把數(shù)據(jù)保存在內(nèi)部寄存器中速度會(huì)更快。在一段很長(zhǎng)的又互相依賴的代碼鏈中避免讀寫依賴顯得尤其重要。如果讀寫依賴發(fā)生在操作數(shù)組時(shí)許多編譯器不能自動(dòng)優(yōu)化代碼以避免讀寫依賴。所以推薦程序員手動(dòng)去消除讀寫依賴舉例來(lái)說(shuō)引進(jìn)一個(gè)可以保存在寄存器中的臨時(shí)變量。這樣可以有很大的性能提升。下面一段代碼是一個(gè)例子不好的代碼float x[VECLEN]y[VECLEN]z[VECLEN]//。。。。。。for(unsigned int k 1k VECLENk ){ x[k] x[k-1] y[k]} for(k 1k VECLENk){ x[k] z[k] * (y[k] - x[k-1])}推薦的代碼float x[VECLEN]y[VECLEN]z[VECLEN]//。。。。。。float t(x[0])for(unsigned int k 1k VECLENk ){ t t y[k] x[k] t}t x[0]for (k 1k VECLENk ){ t z[k] * (y[k] - t) x[k] t}6 循環(huán)不變計(jì)算對(duì)于一些不需要循環(huán)變量參加運(yùn)算的計(jì)算任務(wù)可以把它們放到循環(huán)外面現(xiàn)在許多編譯器還是能自己干這件事不過(guò)對(duì)于中間使用了變量的算式它們就不敢動(dòng)了所以很多情況下你還得自己干。對(duì)于那些在循環(huán)中調(diào)用的函數(shù)凡是沒必要執(zhí)行多次的操作通通提出來(lái)放到一個(gè)init函數(shù)里循環(huán)前調(diào)用。另外盡量減少喂食次數(shù)沒必要的話盡量不給它傳參需要循環(huán)變量的話讓它自己建立一個(gè)靜態(tài)循環(huán)變量自己累加速度會(huì)快一點(diǎn)。還有就是結(jié)構(gòu)體訪問(wèn)東樓的經(jīng)驗(yàn)凡是在循環(huán)里對(duì)一個(gè)結(jié)構(gòu)體的兩個(gè)以上的元素執(zhí)行了訪問(wèn)就有必要建立中間變量了(結(jié)構(gòu)這樣那C的對(duì)象呢?想想看)看下面的例子:舊代碼:total a-b-c[4]-aardvark a-b-c[4]-baboon a-b-c[4]-cheetah a-b-c[4]-dog;新代碼struct animals * temp a-b-c[4];total temp-aardvark temp-baboon temp-cheetah temp-dog;一些老的C語(yǔ)言編譯器不做聚合優(yōu)化而符合ANSI規(guī)范的新的編譯器可以自動(dòng)完成這個(gè)優(yōu)化看例子:float abcdfg;//。。。a b / c * d;f b * g / c;這種寫法當(dāng)然要得但是沒有優(yōu)化float abcdfg;//。。。a b / c * d;f b / c * g;如果這么寫的話一個(gè)符合ANSI規(guī)范的新的編譯器可以只計(jì)算b/c一次然后將結(jié)果代入第二個(gè)式子節(jié)約了一次除法運(yùn)算。7 說(shuō)明該方案主要是考慮到在嵌入式開發(fā)中對(duì)程序執(zhí)行速度的要求特別高所以該方案主要是為了優(yōu)化程序的執(zhí)行速度。注意優(yōu)化是有側(cè)重點(diǎn)的優(yōu)化是一門平衡的藝術(shù)它往往要以犧牲程序的可讀性或者增加代碼長(zhǎng)度為代價(jià)。???????????????? END ???????????????關(guān)注我的微信公眾號(hào)回復(fù)“星球”加入知識(shí)星球有問(wèn)必答。點(diǎn)擊“閱讀原文”查看知識(shí)星球詳情歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。
版權(quán)聲明: 本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

山西網(wǎng)站開發(fā)網(wǎng)頁(yè)制作多少錢一個(gè)頁(yè)面

山西網(wǎng)站開發(fā),網(wǎng)頁(yè)制作多少錢一個(gè)頁(yè)面,網(wǎng)絡(luò)營(yíng)銷的收獲與體會(huì),青島網(wǎng)站有限公司風(fēng)儲(chǔ)虛擬慣量調(diào)頻仿真模型#xff0c;風(fēng)電調(diào)頻#xff0c;一次調(diào)頻#xff0c;四機(jī)兩區(qū)系統(tǒng)#xff0c;采用頻域模型法使

2026/01/21 18:10:01

用手機(jī)做網(wǎng)站視頻小公司企業(yè)簡(jiǎn)介300字

用手機(jī)做網(wǎng)站視頻,小公司企業(yè)簡(jiǎn)介300字,上海營(yíng)銷型網(wǎng)站開發(fā),電子報(bào)刊的傳播媒體是什么為什么會(huì)感覺blazor回到了asp時(shí)代#xff1f;我們來(lái)看看兩者的相似之處#xff1a;這種感覺主要應(yīng)該源于

2026/01/23 06:06:01

中醫(yī)醫(yī)院網(wǎng)站建設(shè)需求建筑模板哪種好

中醫(yī)醫(yī)院網(wǎng)站建設(shè)需求,建筑模板哪種好,輿情監(jiān)測(cè)軟件有哪些,網(wǎng)站怎么開通微信支付還在為錯(cuò)過(guò)Epic Games商店的每周特惠游戲而煩惱嗎#xff1f;現(xiàn)在有一款名為epicgames-freebies-

2026/01/21 19:59:01

機(jī)場(chǎng)建設(shè)相關(guān)網(wǎng)站徐州市經(jīng)濟(jì)技術(shù)開發(fā)區(qū)建設(shè)局網(wǎng)站

機(jī)場(chǎng)建設(shè)相關(guān)網(wǎng)站,徐州市經(jīng)濟(jì)技術(shù)開發(fā)區(qū)建設(shè)局網(wǎng)站,青島專業(yè)網(wǎng)站建設(shè),成都手機(jī)網(wǎng)站建設(shè)哪FlipIt是一款專為Windows系統(tǒng)設(shè)計(jì)的免費(fèi)翻頁(yè)時(shí)鐘屏幕保護(hù)程序#xff0c;它將你的電腦閑置屏幕轉(zhuǎn)變?yōu)閮?yōu)雅

2026/01/23 11:24:02