|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
for () 優(yōu)化 |
| 作者:wangyibo 欄目:單片機(jī) |
請(qǐng)教各位 如下程序怎么優(yōu)化啊,謝謝! n=0x80; for(i=0,k=7;i<8;i++,k--) { m=0x80; for(j=0;j<16;j++) { if(Res_cont[i][j] !=0) Res_cont[8][k] |=m; m >>=(j&0x01); } if((Res_cont[i][16] !=0)&&(Res_cont[i][16] !=0xff)) Res_cont[8][8] |=n; n >>=1; BRIDGE[k]=Res_cont[8][k]; } BRIDGE[8]=Res_cont[8][8]; |
| 2樓: | >>參與討論 |
| 作者: wangyibo 于 2006/1/11 15:40:00 發(fā)布:
換行錯(cuò)了 n=0x80; for(i=0,k=7;i<8;i++,k--) { m=0x80; for(j=0;j<16;j++) { if(Res_cont[i][j] !=0) Res_cont[8][k] |=m; m >>=(j&0x01); } if((Res_cont[i][16] !=0)&&(Res_cont[i][16] !=0xff)) Res_cont[8][8] |=n; n >>=1; BRIDGE[k]=Res_cont[8][k]; } BRIDGE[8]=Res_cont[8][8]; |
|
| 3樓: | >>參與討論 |
| 作者: afanti 于 2006/1/11 16:12:00 發(fā)布:
re 你的程序上的for語(yǔ)句用的不夠好,類似for(i=0;i<8;i++)可以這樣寫for(i=8;i!=0;i--),是因?yàn)榭梢允褂胐ecfsz指令,具體的結(jié)果你看看匯編代碼吧。 還有你使用2維數(shù)組,MCU計(jì)算偏移量時(shí)使用乘法計(jì)算,造成代碼較多。 |
|
| 4樓: | >>參與討論 |
| 作者: wangyibo 于 2006/1/11 16:26:00 發(fā)布:
for(i=8;i!=0;i--), 不一定頂用 謝謝 不過(guò),把for(i=0;i<8;i++)可以這樣寫for(i=8;i!=0;i--),我看了執(zhí)行的時(shí)間上一樣的,沒有改觀的, 。2維數(shù)組,MCU計(jì)算偏移量時(shí)使用乘法計(jì)算",應(yīng)該不是吧,不知道還有誰(shuí)知道不知道,不過(guò)就算用乘法,它內(nèi)部也有硬件乘法器啊,一個(gè)乘法也需要一個(gè)指令周期。 |
|
| 5樓: | >>參與討論 |
| 作者: gfs0521 于 2006/1/11 16:36:00 發(fā)布:
改成for(i=8;--i;) 代碼和時(shí)間會(huì)減小 |
|
| 6樓: | >>參與討論 |
| 作者: afanti 于 2006/1/11 16:36:00 發(fā)布:
re 你是優(yōu)化代碼還是優(yōu)化執(zhí)行時(shí)間? 修改for語(yǔ)句確實(shí)能減少代碼和執(zhí)行時(shí)間,但是和循環(huán)內(nèi)的語(yǔ)句比不能體現(xiàn)優(yōu)勢(shì)。建議樓主多看看C編譯后的代碼,多了解匯編。 要想優(yōu)化執(zhí)行的時(shí)間,恐怕有點(diǎn)難,你的循環(huán)太長(zhǎng)了,需要自己想了,你的C代碼倒是不多,但是MCU執(zhí)行起來(lái)就多了 * - 本貼最后修改時(shí)間:2006-1-11 16:47:19 修改者:afanti |
|
| 7樓: | >>參與討論 |
| 作者: wangyibo 于 2006/1/11 17:03:00 發(fā)布:
確實(shí)我想優(yōu)化執(zhí)行的時(shí)間 以上各位的方法我都試過(guò),變化不大--在時(shí)間上.至于代碼的長(zhǎng)短沒關(guān)系, 主要要求時(shí)間短 |
|
| 8樓: | >>參與討論 |
| 作者: su_mj000 于 2006/1/12 11:35:00 發(fā)布:
How about this way? CHAR *bp = &BRIDGE[7]; CHAR *rp = &Res_cont[8][7]; n = 0x80; for (i = 0; i < 8; i++) { CHAR tmp; m = 0x80; for (j = 0; j < 16; j++) { if ( Res_cont[i][j] != 0 ) *rp |= m; if ( (j & 0x01) ) m >>= 1; } tmp = Res_cont[i][16]; if ( (tmp != 0) && (tmp != 0xff) ) Res_cont[8][8] |= n; n >>= 1; *bp-- = *rp--; } BRIDGE[8] = Res_cont[8][8]; |
|
| 9樓: | >>參與討論 |
| 作者: wangyibo 于 2006/1/12 13:41:00 發(fā)布:
有改善哦 su_mj000 su_mj000 的改成指針的方式還真的有改善啊,時(shí)間上小了200US啊,謝謝了,不過(guò)為什么指針就時(shí)間小了, 不知道還有沒有更小的時(shí)間方式 |
|
| 10樓: | >>參與討論 |
| 作者: wangyibo 于 2006/1/12 13:47:00 發(fā)布:
中間變量 tmp 中間變量 tmp 來(lái)替換Res_cont[i][16];應(yīng)該沒什么改善吧 |
|
| 11樓: | >>參與討論 |
| 作者: su_mj000 于 2006/1/13 11:53:00 發(fā)布:
偏移是變量 數(shù)組(尤其是多維數(shù)組)的偏移是變量值時(shí)將牽涉到較多的 運(yùn)算(甚至乘法),所以得盡量減少它們地出現(xiàn).而指針的 遞增/遞減運(yùn)算卻快得多. 不知樓主用的是何種編譯.若編譯的優(yōu)化度較低時(shí),此處的 tmp就會(huì)起做用(因?yàn)镽es_cont[i][16]出現(xiàn)兩次).語(yǔ)句 的優(yōu)化只是雕蟲小技,重要的是對(duì)算法進(jìn)行優(yōu)化. |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |